13-Operator Chains(任务链)

一、数据传输形式

Stream在算子之间传输数据的形式可以是one-to-one(forwarding)的模式也可以是redistributing的模式,具体是哪一种形式,取决于算子的种类。

  • One-to-one:
    stream(比如在source和map operator之间)维护着分区以及元素的顺序。那意味着flatmap 算子的子任务看到的元素的个数以及顺序跟source 算子的子任务生产的元素的个数、顺序相同,map、fliter、flatMap等算子都是one-to-one的对应关系。类似于spark中的窄依赖
  • Redistributing:
    stream(map()跟keyBy/window之间或者keyBy/window跟sink之间)的分区会发生改变。每一个算子的子任务依据所选择的transformation发送数据到不同的目标任务。例如,keyBy()基于hashCode重分区、broadcast和rebalance会随机重新分区,这些算子都会引起redistribute过程,而redistribute过程就类似于Spark中的shuffle过程。类似于spark中的宽依赖。

二、任务链合并

  • Flink 采用了一种称为任务链的优化技术,可以在特定条件下减少本地通信的开销。为了满足任务链的要求,必须将两个或多个算子设为相同的并行度,并通过本地转发(local forward)的方式进行连接
  • 相同并行度的 one-to-one 操作,Flink 这样相连的算子链接在一起形成一个 task,原来的算子成为里面的 subtask
    并行度相同、并且是 one-to-one 操作,两个条件缺一不可

三、代码使用

        env.disableOperatorChaining();//全局禁用任务链合并
        dataStreamSource.flatMap().disableChaining(); //将某算子禁用任务链合并
        dataStreamSource.flatMap().startNewChain();  //flatmap前是一个任务链,后面是一个任务链
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.Flink 运行时的角色 Flink系统架构中包含了两个角色,分别是JobManager和TaskManage...
    Rex_2013阅读 1,531评论 0 4
  • 思考问题:1.怎么样实现并行计算?答:设置并行度。多线程,不同任务放到不同线程上。 2.并行的任务,需要占用多少s...
    yayooo阅读 4,304评论 0 0
  • 运行时组件 作业管理器(JobManager) 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同...
    架构师老狼阅读 499评论 0 0
  • Flink程序的执行具有并行、分布式的特性。在执行过程中,一个流(stream)包含一个或多个分区(stream ...
    yayooo阅读 1,468评论 0 0
  • 所有的Flink程序都是由三部分组成的:Source、Transformation、Sink。做各种各样的转换操作...
    勇于自信阅读 916评论 0 0