一、知识铺垫
a. Flink数据传输分类
Flink数据传输分为 组件之间的通信消息传输 和 算子之间的流数据传输。
(1)组件之间
组件(即Client、JobManager、TaskManager)之间的通信消息传输采用Akka框架。常见的通信包括心跳检测、状态上报、指标统计、作业提交和部署等。
(2)算子之间
(2.1)本地线程内(同一个SubTask内的两个Operator):数据传输通过方法调用进行,即上游算子处理完数据后,直接调用下游算子的processElement方法。
(2.2)本地线程间(同一个TaskManager的不同SubTask中):数据传输通过本地内存进行,需要进行数据的序列化和反序列化。
(2.3)跨网络(不同TaskManager的SubTask中):采用Netty框架,通过Socket进行数据传输,也需要进行数据的序列化和反序列化。
Flink中为上下游subtask之间数据传输(即上述2.2&2.3)提供了九种传输策略。
其中BinaryHashPartitioner位于Blink的Table API的org.apache.flink.table.runtime.partitioner包中,是一种针对BinaryRowData的哈希分区器。
本文讨论上图中绿色框圈中的八种策略。
在Flink WebUI中,可看到算子之间的传输策略会在箭头上标注出来。