Flink中的数据传输
我们上面说了,TaskManager之间存在着数据传输,如果是跨TaskManager的,是需要进行网络传输的
每个TaskManager都维护了一个收发数据的网络缓冲池,
而且由于TaskManager中的算子往往需要和多个其他TaskManager中算子建立连接,那么一个算子可能需要维护多个缓冲池,故彼此连接,缓冲区数量可能达到算子数量的平方级别.
如果是TaskMananger内部交换数据的花,那么数据会被序列化到一个字节缓冲区中,接受任务会从这个队列中获取记录.
而且Flink采用了多种技术来降低任务之间的通信开销,分别是基于信用值的流量控制和任务链接
因为逐条发送记录会导致额外的开销和效率低下,如果想要充分的利用网络连接带宽,需要对数据进行缓冲.
Flink实现了基于信用值的流量控制机制,这是由接受者发送一个信用通知,附带一个信用值,来表示可以接受的网络缓冲大小,发送端收到后,就会在信用值限定范围内发送数据,同时也附带自己的积压值.
这样下一轮发送的时候,就会根据积压值算出新的信用值来管理可以接受的缓冲大小.
任务链接,这是利用线程内部通信来降低本地通信延迟.如果多个算子具有相同的并行度,且可以通过本地转发方式连接,那么Flink会将其放在一个线程中执行,这样的数据传输就相当的简单.连序列化传输都不存在.
而对于一些计算密集型的函数,则不希望启用任务链接,当然Flink也提供了针对某一个应用禁用任务链接并单独控制单个算子的链接行为的配置.