Flink
文章平均质量分 85
深入理解Flink内核源码
墨玉浮白
这个作者很懒,什么都没留下…
展开
-
深入理解Flink基于信用值的反压机制
当OperatorChain中的最后一个StreamOperator处理完数据后,会通过RecordWriter组件将StreamRecord序列化后写入到ResultSubPartition的BufferConsumer队列中,然后更新ResultSubPartition的Backlog值当InputChannel要读数据时,会为它创建数据视图和CreditBasedSequenceNumberingViewReader来完成对ResultSubPartition中BufferConsumer的消费。原创 2019-06-29 12:11:21 · 461 阅读 · 1 评论 -
InputGate数据读取
数据消费视图为监听器提供了读取Buffer数据的方法,具体的读取逻辑由ResultSubPartition提供:取出BufferConsumer队列头部的BufferConsumer,将其还原成Buffer。否则,创建RemoteInputChannel。当InputGate想要读取数据,会向上游节点发送“PartitionRequest消息”,上游节点会为其准备好PipelinedSubpartitionView(数据消费视图,能够消费ResultSubPartition中的Buffer数据)原创 2019-03-24 15:35:56 · 530 阅读 · 1 评论 -
StreamTask数据流
将OperatorChain的HeadOperator作为主要参数,就是为了能让DataOutput组件可以将InputGate接入的BufferOrEvent数据,传递给OperatorChain中的HeadOperator,做进一步的处理、转换。根据不同的数据来源,StreamTaskInput分为:从网络获取数据的StreamTaskNetworkInput、从外部系统获取数据的StreamTaskSourceInput。此时StreamTask就已经具备了接收外部数据并处理的能力了。原创 2019-06-21 20:15:47 · 435 阅读 · 0 评论 -
深入理解Flink Mailbox线程模型
作为StreamTask的子类,SourceStreamTask会额外启动另一个独立的LegacySourceFunctionThread线程来执行SourceFunction中的循环(生产无界流),Mailbox线程(主线程)依然负责处理Mail和默认操作。负责为Source生产无界流数据的LegacySourceFunctionThread线程启动后,不管是启动成功 or 出现异常,都会封装对应的Mail并发送给Mailbox,而Mailbox线程的processMail一直在等待处理Mail。原创 2023-08-15 20:38:43 · 1161 阅读 · 0 评论 -
深入理解Flink IntervalJoin源码
接着会经历嵌套for循环,判断哪些StreamRecord是满足Join条件的:以当前StreamRecord的Timestamp和指定的上、下界组成时间过滤条件,对当前StreamRecord的“对方MapState”内的每个Timestamp(作为Key)进行比对。接着将当前StreamRecord写入到对应的MapState中。先取出当前StreamRecord中的Timestamp检查它是否已经迟到了,判断依据为:当前StreamRecord中的Timestamp是否小于当前Watermark。原创 2023-08-11 11:59:07 · 1015 阅读 · 0 评论 -
深入理解Flink异步I/O原理
当StreamElement被添加到指定的StreamElementQueue队列后,接着就该调用用户自定义处理函数AsyncFunction#asyncInvoke()方法来对队列中的StreamElement执行异步处理逻辑。回顾demo,在自定义处理函数的最后,手动调用了ResultFuture.complete()方法。作为ResultFuture接口的实现子类,ResultHandler提供了对“执行完异步处理逻辑的结果”进行后续处理的具体实现逻辑/**原创 2023-05-16 17:23:32 · 1035 阅读 · 0 评论 -
RecordWriter核心设计实现
根据创建得到的RecordWriter组件的数量,构建出RecordWriter代理(到底是哪个)RecordSerializer是RecordWriter组件的核心之一,负责将StreamRecord(数据元素,也就是理解意义上的“砖”)序列化成二进制(粒度更细的“沙子”),临时暂存到ByteBuffer(缓冲区,也就是理解意义上的“拖拉机”)上。RecordWriter定义了获取指定InputChannel所对应的BufferBuilder的抽象方法,而它的2个抽象实现子类为其提供了具体的实现逻辑。原创 2023-04-20 10:19:53 · 528 阅读 · 0 评论 -
JobMaster和ResourceManager建立RPC连接
JobMaster要想跟ResourceManager建立RPC连接,首先得准备好连接所需的RegisteredRpcConnection,它代表了2个RPC节点之间建立的RPC连接。所谓建立RPC连接,就是注册。拿着目标RPC节点的Gateway,将自己注册给它,并拿到注册结果–RegistrationResponse。原创 2023-04-03 16:27:06 · 414 阅读 · 0 评论 -
构建Transformation树
Transformation表示从一个DataStream生成另一个DataStream的转换操作,就好像一张纸经过一番折叠操作就会成为一个纸飞机,而这个“一番折叠操作”正是Transformation。后面对“虚拟Transformation”进行解析时,会添加虚拟节点,其本质操作就是按照映射关系:“虚拟节点id:Tuple3(Transformation ID,Partitioner,ShuffleMode)”,将其保存到Map结构中。原创 2023-03-25 16:38:50 · 175 阅读 · 0 评论 -
OperatorChain设计
在递归调用过程中,会捎带着一并创建好OperatorChain内的StreamOperator(HeadOperator除外,它会在最后单独添加),并保存到List集合中。在递归的最底层,会创建(上游算子为单输出类型的)ChainingOutput或CopyingChainingOutput,并会被像RecordWriterOutput一样,和对应的StreamEdge一并包装成Tuple2后,添加到List集合中。在OperatorChain的构造方法中,最核心的就是构建对应类型的Output组件。原创 2023-03-20 16:19:01 · 377 阅读 · 0 评论 -
完成Checkpoint发送ACK给CheckpointCoordinator
CheckpointCoordinator收到AcknowledgeCheckpoint后,会根据checkpointId,从映射关系为“checkpointId:PendingCheckpoint”的Map集合中取出对应的PendingCheckpoint,并判断是否收到了ACK消息。SchedulerNG收到后,会将ACK消息包装成AcknowledgeCheckpoint,并将其交给传递给CheckpointCoordinator组件处理。于是,ACK消息就名正言顺的到了JobMaster手里。原创 2023-03-17 15:53:04 · 589 阅读 · 0 评论 -
解析开启Checkpoint流程源码
能够看出,ExecutionGraph开启Checkpoint的本质就是准备好用来控制Source节点触发Checkpoint的CheckpointCoordinator组件,并向JobManager注册一个能够监听到Job状态变化的监听器JobStatusListener。一旦监听到Job运行状态为RUNNING,会触发CheckpointCoordinator组件的启动,就此,奔流不息的Checkpoint就正式揭开帷幕了…原创 2023-03-17 14:25:36 · 184 阅读 · 0 评论 -
解析创建KeyedState流程源码
由于在(StreamTask反射)beforeInvoke的“状态初始化”阶段已经把StateInitializationContext(保存了可以创建xxxState的xxxStateStore)交给了StreamOperator的自定义RichFunction,并且AbstractStreamOperator也已经通过成员变量的方式“持有”了KeyedStateStore。各种类型的State则为StateFactory#createState()提供了各自的实现逻辑,此时,原创 2023-03-16 17:05:06 · 325 阅读 · 0 评论 -
状态初始化源码解读
然后将StateInitializationContext传递给AbstractUdfStreamOperator中的CheckpointedFunction,如果有自定义需求,就可以在CheckpointedFunction接口定义的接口方法initializeState()的具体实现中,利用StateInitializationContext取出StateStore,并完成“状态初始化”操作!开发者可以在自定义Function中,使用上下文来灵活的获取各种State。原创 2023-03-16 14:50:13 · 349 阅读 · 0 评论 -
StreamTask异步执行Checkpoint操作
AsyncCheckpointRunnable负责执行“快照持久化操作”,容纳所有的OperatorSnapshotFutures对象的Map集合都已经被保存到这个Runnable中了。原创 2023-03-15 15:33:40 · 332 阅读 · 0 评论 -
源码剖析通过Barrier对齐触发Checkpoint流程
*上游Task实例发送的数据元素和事件,会发送到下游Task节点的InputGate中。**当Task实例接收到上游节点发送来的所有的CheckpointBarrier后,当前Task实例就会触发当前节点的Checkpoint操作。CheckpointBarrierAligner就是能够保证Exactly-Once的实现子类,它会对所有InputChannel中的CheckpointBarrier事件严格控制对齐,视情况决定Task实例中的InputChannel的block和打开的时机。原创 2023-03-14 13:55:08 · 200 阅读 · 0 评论 -
CheckpointCoordinator触发执行Checkpoint流程
TaskExecutor收到Execution发送的“触发执行Checkpoint”请求后,会根据尝试执行Execution的唯一标识,从TaskSlotTable中取出对应的Task实例,让Task执行具体的Checkpoint操作。至此,CheckpointCoordinator就完成了它“触发执行Checkpoint”的使命,并将其交给每个Source节点所对应的Execution来完成具体的执行。最终,由StreamTask提供“触发执行Checkpoint”操作的具体实现。原创 2023-03-13 20:55:37 · 570 阅读 · 0 评论 -
生成ExecutionGraph
深入理解Flink核心源码之生成ExecutionGraph原创 2023-03-07 20:14:16 · 472 阅读 · 0 评论 -
Flink作业提交流程
Dispatcher接收JobGraph并分发原创 2022-12-28 12:50:37 · 359 阅读 · 0 评论 -
深入理解Flink基于StreamGraph构建JobGraph的流程
构建JobGraph原创 2022-12-27 19:55:34 · 361 阅读 · 0 评论 -
深入理解Flink StreamGraph构建流程
StreamGraph构建原创 2022-12-27 11:41:13 · 864 阅读 · 0 评论 -
JobGraphStore的设计与实现
JobGraphStore的设计与实现原创 2022-12-24 17:35:54 · 585 阅读 · 0 评论 -
基于ZK实现高可用服务
高可用服务原创 2022-12-24 15:43:42 · 1349 阅读 · 1 评论 -
Slot计算资源管理
Slot资源管理原创 2022-12-24 10:56:58 · 1277 阅读 · 0 评论 -
TaskManager的启动流程
TaskManager的启动流程原创 2022-11-06 14:43:18 · 1104 阅读 · 0 评论 -
Window Trigger的设计与实现
Window Trigger的设计与实现原创 2022-10-31 14:25:01 · 500 阅读 · 0 评论 -
WindowAssigner设计
抽象类WindowAssigner设计原创 2022-10-31 10:15:54 · 320 阅读 · 0 评论 -
Function接口设计
Function接口设计原创 2022-10-27 19:50:45 · 454 阅读 · 0 评论 -
StreamOperatorFactory接口设计
StreamOperatorFactory原创 2022-10-26 16:28:48 · 284 阅读 · 0 评论 -
DataStream算子转换过程
DataStream算子转换原创 2022-10-26 10:20:43 · 759 阅读 · 0 评论