Flink的并行度介绍一下?
概述
Flink的并行度(Parallelism)是指在Flink作业中并行执行任务的程度。它决定了作业中任务的数量以及任务之间的数据划分和分配方式。并行度是一个重要的概念,对于实现高吞吐量和低延迟的流处理非常关键。
在Flink中,有两个级别的并行度可以进行配置:
- 作业级别并行度(Job Parallelism):
- 作业级别并行度是指整个作业中任务的数量,它决定了作业的整体并行执行能力。
- 作业级别并行度可以在提交作业时通过编程API或命令行参数进行指定。例如,可以设置作业级别并行度为4,表示将作业划分为4个并发任务进行执行。
- 作业级别并行度通常与集群中可用的计算资源数量相关联,以充分利用集群的处理能力。
- 算子级别并行度(Operator Parallelism):
- 算子级别并行度是指每个算子(Operator)的任务数量,它决定了每个算子的并行执行程度。
- 在Flink中,每个算子都可以独立地设置并行度。默认情况下,算子的并行度与作业级别并行度相同,但可以根据需要进行调整。
- 通过设置算子级别并行度,可以根据数据流的特点和负载分布,实现更细粒度的任务划分和负载均衡。
并行度的选择需要考虑多个因素,包括可用的计算资源、数据流的特性、任务之间的依赖关系以及作业的性能需求。合理的并行度设置可以充分利用集群的资源,提高作业的吞吐量和响应时间。同时,还需要避免过度的并行度,以避免资源浪费和额外的通信开销。
需要注意的是,并行度的设置也会影响作业的一致性和结果正确性。在具有有状态操作的情况下,确保正确的并行度设置以保持正确的状态管理和结果一致性非常重要。
补充
Flink程序在执行的时候,会被映射成一个**Streaming Dataflow。**一个Streaming Dataflow是由一组Stream和Transformation Operator组成的。在启动时从一个或多个Source Operator开始,结束于一个或多个Sink Operator。
Flink程序本质上是并行的和分布式的,在执行过程中,一个流(stream)包含一个或多个流分区,而每一个operator包含一个或多个operator子任务。操作子任务间彼此独立,在不同的线程中执行,甚至是在不同的机器或不同的容器上。
operator子任务的数量是这一特定operator的并行度。相同程序中的不同operator有不同级别的并行度。
一个Stream可以被分成多个Stream的分区,也就是Stream Partition。一个Operator也可以被分为多个Operator Subtask。如上图中,Source被分成Source1和Source2,它们分别为Source的Operator Subtask。每一个Operator Subtask都是在不同的线程当中独立执行的。一个Operator的并行度,就等于Operator Subtask的个数。
上图Source的并行度为2。而一个Stream的并行度就等于它生成的Operator的并行度。数据在两个operator之间传递的时候有两种模式:
(1)One to One模式:两个operator用此模式传递的时候,会保持数据的分区数和数据的 排序;如上图中的Source1到Map1,它就保留的Source的分区特性,以及分区元素处理的有序性。
(2)Redistributing (重新分配)模式:这种模式会改变数据的分区数;每个operator subtask会根据选择transformation把数据发送到不同的目标subtasks,比如keyBy()会通过hashcode重新分区,broadcast()和rebalance()方法会随机重新分区。