Flink 源码分析之一文搞懂 Flink 消息全流程

我们以下面代码为例:



 

FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("canal_monitor_order_astable", new SimpleStringSchema(), properties);

consumer.setStartFromEarliest();

env.addSource(consumer).flatMap(...).print()



当 Flink 程序启动,leader、blobServer 等都创建完毕,当 ExecutionGraph 构建完成,提交成功之后。就到了,task 正式执行的阶段了。这个时候,一条消息是如何流转的呢?

首先,进入了 Task 的 run 方法



 

......

/*

这个方法就是用户代码所真正被执行的入口。比如我们写的什么 new MapFunction() 的逻辑,最终就是在这里被执行的

*/

// run the invokable

invokable.invoke();

......

然后就到了 StreamTask 的 invoke 方法,这里是每个算子真正开始执行的地方



 

......

run();

.....

最为关键的就是 run 方法。

进入 SourceStreamTask run 方法



 

@Override

// source task 获取数据的入口方法

protected void run() throws Exception {

headOperator.run(getCheckpointLock(), getStreamStatusMaintainer());

}

继续追踪就到了 StreamSource 的 run 方法



 

......

// 生成上下文之后,接下来就是把上下文交给 SourceFunction 去执行,用户自定义的 run 方法开始正式运行

userFunction.run(ctx);

......

此处的 userFunction 实际上就是 FlinkKafkaConsumer

具体是如何消费消息的可以参考

写给大忙人看的Flink 消费 Kafka

彻底搞懂 Flink Kafka OffsetState 存储

继续追踪到 RecordWriter



 

private void emit(T record, int targetChannel) throws IOException, InterruptedExcepti

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值