分类 原理分析 中的文章

Flink 内存管理

重点包括:

  • MemorySegment 是 Flink 最小的内存分配单元,默认 32KB,既可以直接驻留内存,也可以在必要时借助序列化写到磁盘
  • HeapMemorySegmentDataInputViewDataOutputView 这些基础抽象分别负责堆内内存访问、读取视图和写入视图,是上层算子和序列化框架的基础
  • MemoryManager 主要管理排序、哈希、缓存等更偏离线计算的内存,而 NetworkBufferPool 则通过 MemorySegmentFactory 申请网络缓冲区使用的内存
  • 调用链可以从 TaskManager -> TaskSlot -> MemorySegment 这条路径去理解,后面再结合 KryoSerializerTypeInformation 看 Flink 的序列化体系怎么工作
flink_4/4.jpg flink_4/5.jpg flink_4/6.jpg flink_4/7.jpg flink_4/8.jpg flink_4/9.jpg flink_4/10.jpg flink_4/11.jpg+1

阅读全文

Flink RPC

重点包括:

  • RPC 层:Flink 早期基于 Akka 构建 RPC,DispatcherJobMasterResourceManager 等组件都继承 RpcEndpoint,而 RpcServer 则通过 AkkaInvocationHandler 完成动态代理
  • 网络栈:TaskManager 之间的数据传输走 Netty,数据从 RecordWriter 写入本地 buffer,再进入 ResultPartition,最后发给对端的 Netty,再转入 InputGate -> OperatorChain -> StreamTaskInput
  • 任务执行模型:包括直接从外部源读取数据的 SourceStreamTask / SourceReaderStreamTask,以及支持从网络或本地消费数据的 OneInputStreamTask / TwoInputStreamTask
  • Shuffle 与反压ResultPartitionIntermediateResultPartition 的底层物理实现,包含多种实现形态;而基于 credit 的反压机制里,每个 credit 基本就对应一个上游 buffer(默认 32KB)
flink_3/18.jpg flink_3/19.jpg flink_3/20.jpg flink_3/21.jpg flink_3/22.jpg flink_3/23.jpg flink_3/24.jpg flink_3/25.jpg+32

阅读全文

Flink 状态管理

Flink 的状态数据、后端实现和 checkpoint 主线串起来:

  • 先看 State 体系本身,包括 MapStateValueStateBroadcastState 以及内部使用的 InternalKvState
  • 再看 KeyedStateOperatorState 两条实现路径,以及 HeapRocksDBStateTableOperatorStateBackend 这些核心组件
  • 最后把 checkpoint 的触发、barrier 对齐、下游传播、ACK 回传和 job-manager 确认完成的过程连起来
flink_3/1.jpg flink_3/2.jpg flink_3/3.jpg flink_3/4.jpg flink_3/5.jpg flink_3/6.jpg flink_3/7.jpg flink_3/8.jpg+18

阅读全文

Flink 集群管理

主要看 Flink 集群是怎么被创建出来、怎么和外部资源管理器打交道的,重点包括:

  • ClusterClientFactory -> ClusterDescriptor -> ClusterClientProvider -> ClusterClient 这条客户端侧的入口链路
  • AbstractContainerizedClusterClientFactoryStandaloneClientFactory 这些不同部署模式下的工厂实现
  • Yarn 和 Kubernetes 两条典型路径里,ResourceManagerTaskExecutorfabric8、pod/Container 启动之间的关系
flink_2/30.jpg flink_2/31.jpg flink_2/32.jpg flink_2/33.jpg flink_2/34.jpg flink_2/35.jpg flink_2/36.jpg flink_2/37.jpg+2

阅读全文

Flink 任务提交

重点是把“提交一个 Flink 作业”拆成几个明确阶段:

  • CLIFrontendPackagedProgramDefaultExecutorServiceLoader 到不同集群类型下的 PipelineExecutor
  • ExecutionEnvironmentStreamExecutionEnvironment 生成 StreamGraph / JobGraph,再交给运行时调度
  • 再往后看 DispatcherJobMasterSlotPoolTaskDeploymentDescriptorStreamTask、Mailbox、重启策略这些运行阶段的关键组件
flink_2/1.jpg flink_2/2.jpg flink_2/3.jpg flink_2/4.jpg flink_2/5.jpg flink_2/6.jpg flink_2/7.jpg flink_2/8.jpg+23

阅读全文

Flink-DataStraem

DataStream 在运行时到底会落到哪些算子和线程模型上:

  • StreamOperatorAbstractStreamOperatorAbstractUdfStreamOperator 一路看到单输入、双输入算子的继承体系
  • 再看 SourceFunctionSinkFunctionTwoPhaseCommitSinkFunctionProcessFunctionKeyedProcessFunction 这些常用扩展点
  • 最后顺着 SourceStreamTask -> StreamSource -> user functionStreamSink -> invoke() 这条路径,把 WatermarkTimerService、端到端一致性串起来
5 21 22 23 24 25 26 27+7

阅读全文

Flink架构

Flink 运行时的脑图,重点包括:

  • Session 集群、Application 集群两种模式,以及客户端、JobManager、TaskManager 之间的基本关系
  • 作业从提交到调度执行的主链路,包括心跳、checkpoint、slot 分配、任务状态汇报
  • 运行时启动时会顺带拉起的组件,比如 RPC service、blob server、metric registry、HA service、heartbeat service 等
flink_3/15.jpg 34 35 36 37 38 40+14

阅读全文

Flink执行图的生成

Flink 逻辑计划到物理执行的主线整理,重点包括:

  • 流任务如何先转换成 StreamGraph,批任务如何进入 OptimizedPlan,最后统一落到 JobGraph
  • StreamNodeStreamEdgeJobVertexJobEdgeIntermediateDataSet 这些图结构节点和边分别代表什么
  • 再往后如何结合并行度、算子链和调度需求,生成最终的 ExecutionGraph 并进入物理执行
17 19 1 2 3 4 5 6+7

阅读全文

Spark 注册数据源

总结:

  • DataSourceRegister 的注册方式,以及自定义 XXRelationProvider 是怎么被 Spark 发现和加载的
  • DataSource 的查找过程,以及 DataFrameReaderDataFrameWriter 在读写路径里的角色
  • 顺手补到 CheckpointRDDPartitionReliableCheckpointRDDSparkSession 内部的 SparkContextsharedStateSQLContextRuntimeConfig

阅读全文

最近文章

分类

归档

标签

RSS