01 引言
在前面的博客,我们学习了Flink
的一些高级API
。
衔接之前的文章,本文要讲的是Flink
里面的并行度。
02 并行度
2.1 并行度定义
并行度:一个Flink
程序由多个Operator
组成(source
、transformation
和 sink
), 一个Operator
由多个并行的Task
(线程)来执行, 一个Operator
的并行Task
(线程)数目就被称为该Operator
(任务)的并行度(Parallel
)。
2.2 并行度指定方式
2.2.1 Operator Level(算子级别)
一个算子、数据源和sink
的并行度可以通过调用 setParallelism()
方法来指定
2.2.2 Execution Environment Level(Env级别)
执行环境(任务)的默认并行度可以通过调用setParallelism()
方法指定。为了以并行度3来执行所有的算子、数据源和data sink
, 可以通过如下的方式设置执行环境的并行度:
执行环境的并行度可以通过显式设置算子的并行度而被重写
2.2.3 Client Level(客户端级别,推荐使用)
并行度可以在客户端将job
提交到Flink
时设定。
对于CLI
客户端,可以通过-p
参数指定并行度
./bin/flink run -p 10 WordCount-java.jar
2.2.4 System Level(系统默认级别,尽量不使用)
在系统级可以通过设置flink-conf.yaml
文件中的parallelism.default
属性来指定所有执行环境的默认并行度:
上图流程描述:
- Example1:在fink-conf.yaml中 taskmanager.numberOfTaskSlots默认值为1,即每个Task Manager上只有一个Slot,此处是3,Example1中,WordCount程序设置了并行度为1,意味着程序 Source、Reduce、Sink在一个Slot中,占用一个Slot
- Example2:通过设置并行度为2后,将占用2个Slot
- Example3:通过设置并行度为9,将占用9个Slot
- Example4:通过设置并行度为9,并且设置sink的并行度为1,则Source、Reduce将占用9个Slot,但是Sink只占用1个Slot
2.3 并行度注意点
并行度注意点:
- 并行度的优先级:算子级别 >
env级别 >
Client级别 >` 系统默认级别 (越靠前具体的代码并行度的优先级越高); - 如果source不可以被并行执行,即使指定了并行度为多个,也不会生效;
- 在实际生产中,我们推荐在算子级别显示指定各自的并行度,方便进行显示和精确的资源控制;
- slot是静态的概念,是指taskmanager具有的并发执行能力; parallelism是动态的概念,是指程序运行时实际使用的并发能力。
03 文末
本文主要讲解了与Flink
相关的并行度,谢谢大家的阅读,本文完!