Flink数据传输延迟优化方法
Flink作为一个高效的流处理框架,其数据传输延迟的优化是非常重要的。以下是根据搜索结果总结的几种优化方法:
数据倾斜是Flink面临的一个常见问题,它会导致数据集中在某些SubTask上,导致部分SubTask处理数据量特别大,执行时间过长,影响了整个应用程序的执行效率。过多的数据集中在某些JVM(TaskManager),使得JVM的内存资源短缺,导致频繁GC。严重情况下,过长的GC导致TaskManager失联,系统崩溃。
优化方法包括:
调整并发度:对于数据源消费不均匀,比如Kafka数据源,通常是通过调整数据源算子的并发度实现的。通常情况下Source的并发度和Kafka的分区个数一样或者Kafka分区个数是Source并发度的正整数倍。
打散数据分布:通过添加随机前缀打散它们的分布,使得数据不会集中在几个Task中。
自定义分区器:可以通过实现Partitioner接口来自定义数据分片规则,从而达到优化数据分布的目的。
两阶段聚合:在聚合统计前,先进行预聚合,例如两阶段聚合(加盐局部聚合+去盐全局聚合)。
Flink的数据传输需要支持框架本身的特性,例如反压和用于测量延迟的latencymarker。在社区不断的迭代中,Flink逐渐积累了一套值得研究的网络栈(NetworkStack),本文主要基于NicoKruber在去年9月FlinkForwardBerlin上的分享[1],涉及到的技术主要有1.5版本引入的Creditbased数据流控制以及在延迟和吞吐方面做的优化。
Creditbased数据流控制的核心思想则是根据接收端的空闲Buffer数(即Credit)来控制发送速率,这和TCP的速率控制十分类似,不过是作用在应用层。
Flink提供了`allowedLateness`方法来设置允许窗口数据延迟的时间,超过这个时间的元素就会被丢弃,这个的默认值是0,该设置仅针对于以EventTime开的Window。水位线允许数据延迟时间是在Watermark允许延迟时间的基础上增加的时间。
Flink
on
Yarn模式下,有JobManager和TaskManager两种进程。在任务调度和运行的过程中,JobManager和TaskManager承担了很大的责任。用户可以通过如下操作对Flink集群性能做优化:
配置JobManager内存:JobManager负责任务的调度,以及TaskManager、RM之间的消息通信。当任务数变多,任务平行度增大时,JobManager内存都需要相应增大。
配置TaskManager个数:每个TaskManager每个核同时能跑1个task,所以增加了TaskManager的个数相当于增大课任务的并发度。
配置TaskManagerSlot个数:每个TaskManager多个核同时能跑多个task,相当于增大了任务的并发度。但是由于所有核共用TaskManager的内存,所以要在内存和核数之间做好平衡。
配置TaskManager内存:TaskManager的内存主要用于任务执行、通信等。当一个任务很大的时候,可能需要较多资源,因而内存也可以做相应的增加。
以上就是Flink数据传输延迟优化的主要方法,希望对您有所帮助。