一个Flink程序由多个Operator组成(source、transformation和 sink)。
一个Operator由多个并行的Task(线程)来执行, 一个Operator的并行Task(线程)数目就被称为该Operator(任务)的并行度(Parallel)。即并行度就是相对于Operator来说的。
合理设置并行度可以有效提高Flink作业的性能,但并行度的设置需要根据souce、sink类别、数据量、任务复杂度、集群资源等多个因素综合考虑。下面我们也是从source、transformation和sink来考虑一些优化措施:
1. Kafka Source和Sink的并行度设置
对于Kafka,不管是作为source还是sink,我们都建议将其并行度设置为和Kafka Topic分区数一致,这样每个subtask都能处理一个分区的数据。设置并行度小于Topic分区数则有subtask会读取多个分区数据,有可能会导致数据积压;而设置大于Topic分区数,会导致有subtask不能接收到数据,一是浪费并行度资源,另一方面如果用到watermark,则导致无法产生watermark的问题,影响下游的计算。如果已经等于Kafka的分区数,消费速度仍跟不上数据生产速度,考虑下Kafka要扩大分区,同时调大并行度等于分区数。如果kafka数据量很小,则可以直接设置为1。
2. JDBC Source和Sink的并行度设置
对于JDBC作为Source,我们可以根据Source表是否有可以分区扫描的列,比如有均匀分布的整形或时间类型的字段,我们就可以指定这种字段,然后设置最大最小范围和并行扫描数来并行读取Source来加快速度,这时设置并行度和并行扫描数一致即可。对于JDBC作为Sink,则我们可以根据数据量的大小来设置并行度,可以设置不同的并行度来测试效果(默认并行度和上游operator一致)。
3. FileSystem Source和Sink的并行度配置
对于FileSystem作为Source,主要看数据量来决定。对于FileSystem作为Sink,需要看目标介质的特性以及数据量来考量(默认并行度和上游operator一致)。
4. Transformation阶段的并行度设置
一般按数据量和计算复杂度来考虑。
比如Keyby 之前的算子一般不会做太重的操作,都是比如 map、 filter、 flatmap 等处理较快的算子,并行度可以和 source 保持一致。而Keyby 之后的算子如果计算复杂,可以设置并行度为2的整数次幂。
对于数据倾斜严重的还需要重分区来改善情况。
总体来说,Source的并行度依赖于具体的实现来决定,Transformation阶段的并行度根据任务类型(IO密集型还是CPU密集型)和数据量和分布情况调整,而Sink的并行度需要考虑目标的特性然后再是数据量。但是并行度不建议设置得非常大,因为过大会导致subtask过多,每个运行时间很短,另外就是需要存储的状态数据很多。并行度的设置需要调优测试,查看各个算子的反压情况,不能一概而论。另外推荐在算子(operator)级别来设置并行度,这样子可以精确控制。
标签:设置,分区,Flink,并行度,Source,Sink,数据量 From: https://blog.csdn.net/chanyue123/article/details/144758220