包含标签 flink 的文章

Flink 内存管理

MemorySegment 是Flink的最小内存分配单元、默认 32KB,先放到内存中,也可以序列化,借助KryoSerializer等、内存不够序列化到 磁盘。 HeapMemorySegment 提供了操作堆内存的方法;DataOutputView 扩展了java.io.DataOuput,提供多个写入视图、DataInputView 接口扩展了 java.io.DataInput,提供多个读取视图、MemoryManager主要用于管理排序、哈希和缓存等操作对应的内存空间,且这些操作主要集中在离线计算场景中、NetworkBufferPool通过MemorySegmentFactory申请用于存储NetworkBuffer的MemorySegment内存空间。调用过程:TaskManager –> TaskSlot –> MemorySegment。序列化和反序列化,TypeInformation 分为:BasicTypeInfo、BasicArrayTypeInfo、CompositeType、WritableTypeInfo、GenericTypeInfo

阅读全文

Flink RPC

由Akka 构建的 RPC通讯,Dispatcher,JobMaster、ResourceManager等都继承了RpcEndpoint。RpcServer接口通过AkkaInvocationHandler动态代理类实现。TaskManager之间通过Netty 做通讯,RecordWriter先写到本地buffer,在根据选择输出到ResultPartition,最后发送到netty-server,对端的netty-client接收后,转发给 InputGate–>OperatorChain 的 head 算子,再转给StreamTaskInput(同样也有local buffer)。直接从外部源数据读取数据的SourceStreamTask和SourceReaderStreamTask、支持从网络或本地获取数据的OneInputStreamTask和TwoInputStreamTask。ResultPartition:实际上是ExecutionGraph 中 IntermediateResultPartition 对应的底层物理实现,含多个 ResultSubPartiton 实例。PipelinedResultPartition(类似presto)、BoundedBlockingResultPartition(类似spark)、HsResultPartition (Hybrid Shuffle)、SortMergeResultPartition、BufferWritingResultPartition。ConnectorManager 和 NettyConnectionManager。基于信用的反压机制,每个 creadit 表示一个上游的 buffer(默认 32KB)

阅读全文

Flink 状态管理

状态管理类图,都是继承 State 的,通用的包括MapState,ValueState,BroadcastState等,还有InternalKvState 接口内部使用。根据DataStream数据集是否基于key 分组,操作分为:KeyedState 类型、OperatorState 类型。 KeyedStateBackend,通过SPI 技术用loader加载工厂类,再创建对应的后端,如:HeapKeyedStateBackend 、RocksDBKeyedStateBackend。StateTable抽象类,实现包括CopyOnWriteStateTable、NestedMapsStateTable。OperatorState 状态管理后端:OperatorStateBackend、RawKeyedStateInputs,所有算子的状态数据都只能存储在JVM堆内存中。StateBackend包括:MemoryStateBackend、FsStateBackend、RocksDBStateBackend。Checkpoint的执行过程分为三个阶段:启动、执行、确认完成。通过job-manager触发,下游算子对齐barrier事件,触发算子checkpoint操作,并继续发送到下游和返回ack,直到所有sink完成checkpoint,job-manager通知所有task,完成此次checkpoint操作

阅读全文

Flink 集群管理

先由 ClusterClientFactory 创建 ClusterDescriptor、然后通过 ClusterDescriptor 创建 ClusterClientProvier、最终基于 ClusterClientProvier 实例获取 ClusterClient。支持容器化部署的 AbstractContainerizedClusterClientFactory、不支持容器化部署的 StandaloneClientFactory。通过YarnClient提交应用,YarnClusterClient跟JobManager交互,通过YarnResouceManager来启动YarnTaskExecutorRrunner–>TaskExecutor。TaskExecutor 是内部执行组件,负责真正的执行,以及 状态管理、checkpoint、slots 等;由fabric8 API提交到 api-server,再提交configmap,创建resource-manager pod,再创建出 task-manager pod

阅读全文

Flink 任务提交

通过CLIFrontend 提交应用,不同类型的集群对应不同的PipelineExecutor实现类(SPI方式加载),包括remote、yarn、k8s工厂类;支持离线批计算的ExecutionEnvironment、支持流计算的StreamExecutionEnvironment。StreamGraphGenerator 将 Transformation 集合转换为 ,在PipelineExector中将StreamGraph对象转换成JobGraph数据结构,在JobManager服务中将JobGraph转换为ExecutionGraphStreamGraph,将具体的Task部署到TaskManager中进行调度和执行。一些组件:Dispatcher、JobManagerRunner、JobMaster、SlotPool资源管理。TaskManager中根据TaskDeploymentDescriptor的信息启动Task实例,Task成功添加至taskSlotTable,会立即启动Task线程 。Task 的主要逻辑在 doRun()中, 通过反射来触发 StreamTask 内部的 Operator 执行。使用了Mail box 方式处理任务。StreamElement分类:StreamRecord数据、Watermark事件。Task重启策略:固定延时重启(fixed-delay)、按失败率重启(failure-rate)、无重启(none)。容错:重启全部,重启部分

阅读全文

Flink-DataStraem

StreamOperator,AbstractStreamOperator:各种算子都会继承这个类、包含了各种内部实现。AbstractUdfStreamOperator:StreamFlatMap 继承了这个类,StreamFilter也是(内部会调用userFunction.filter()执行自定义的算子逻辑)。OneInputStreamOperator,可以输入一个算子、TwoInputStreamOperator,可以输入两个算子、通过不断叠加 二元输入,就可以实现多个算子输入。RichFunction、Function、SourceFunction 和 SinkFunction、支持端到端一致性的 TwoPhaseCommitSinkFunction。执行过程:SourceStreamTask#run(继承Thread) –> StreamSource#run() –> SimpleSource;StreamSink#processElement() –> MySink#invoke()。ProcessFunction:低级别API,提供细粒度控制。 KeyedProcessFunction,Watermark,TimerService

阅读全文

Flink架构

架构:flink-program 优化后通过 Actor-System提交到 JobManager(调度,checkpoint)并跟TaskMnager交互,分发任务,同时检查心跳,statistics、任务状态、TaskManager中包括了内存、I/O manager。 Application集群,Session集群。启动流程:还会创建其他一些组件、create RPC service、JMX service、blob server、delegationTokenManager、metricRegistry、haServices、heartbeatServices。ResourceManager内部包含了:JobManagerGateway、WebMonitorEndpoint、ResourceManagerGateway、DispatcherGateway、TaskExecutorGateway

阅读全文

Flink执行图的生成

StreamGraph,会根据 stream、batch 做转换,流的转换为 StreamGraph,批的转换为 OptimizedPlan,最后统一转换为 JobGraph,将算子链接在一起,之后根据并行度生成ExecutionGraph,最后做物理执行。StreamNode、StreamEdge、StreamGrapgh。Plan 继承 Visitor,后面对 Plan 做优化可以用访问者模式遍历。JobGraph和相关的类:JobVertex、JobEdge、IntermediateDataSet

阅读全文