flink solt和并行度

简介
           Flink运行时主要角色有两个:JobManager和TaskManager,不管是standalone集群,flink on yarn都是要启动这两个角色。JobManager主要是负责接受客户端的job,调度job,协调checkpoint等。TaskManager执行具体的Task。TaskManager为了对资源进行隔离和增长容许的task数,引入了slot的概念,这个slot对资源的隔离仅仅是对内存进行隔离,策略是均分,好比taskmanager的管理内存是3GB,假若有两个个slot,那么每一个slot就仅仅有1.5GB内存可用。Client这个角色主要是为job提交作些准备工做,好比构建jobgraph提交到jobmanager,提交完了能够当即退出,固然也能够用client来监控进度。 编程

Jobmanager和TaskManager之间通讯相似于Spark 的早期版本,采用的是actor系统。以下图
api

什么是task?
在spark中:多线程

RDD中的一个分区对应一个task,task是单个分区上最小的处理流程单元。被送到某个Executor上的工做单元,和hadoopMR中的MapTask和ReduceTask概念同样,是运行Application的基本单位,多个Task组成一个Stage并发

上述引入spark的task主要是想带着你们搞明白,如下几个概念:
 app

Flink的并行度由什么决定的?

Flink的task是什么?

Flink的并行度由什么决定的?

这个很简单,Flink每一个算子均可以设置并行度,而后就是也能够设置全局并行度。oop

Api的设置优化

.map(new RollingAdditionMapper()).setParallelism(10)

全局配置在flink-conf.yaml文件中,parallelism.default,默认是1:能够设置默认值大一点spa

Flink的task是什么?
        按理说应该是每一个算子的一个并行度实例就是一个subtask-在这里为了区分暂时叫作substask。那么,带来不少问题,因为flink的taskmanager运行task的时候是每一个task采用一个单独的线程,这就会带来不少线程切换开销,进而影响吞吐量。为了减轻这种状况,flink进行了优化,也即对subtask进行链式操做,链式操做结束以后获得的task,再做为一个调度执行单元,放到一个线程里执行。以下图的,source/map 两个算子进行了链式;keyby/window/apply有进行了链式,sink单独的一个。
线程

说明:图中假设是source/map的并行度都是2,keyby/window/apply的并行度也都是2,sink的是1,总共task有五个,最终须要五个线程。code

默认状况下,flink容许若是任务是不一样的task的时候,容许任务共享slot,固然,前提是必须在同一个job内部。

结果就是,每一个slot能够执行job的一整个pipeline,如上图。这样作的好处主要有如下几点:

1.Flink 集群所需的taskslots数与job中最高的并行度一致。也就是说咱们不须要再去计算一个程序总共会起多少个task了。

2.更容易得到更充分的资源利用。若是没有slot共享,那么非密集型操做source/flatmap就会占用同密集型操做 keyAggregation/sink 同样多的资源。若是有slot共享,将基线的2个并行度增长到6个,能充分利用slot资源,同时保证每一个TaskManager能平均分配到重的subtasks,好比keyby/window/apply操做就会均分到申请的全部slot里,这样slot的负载就均衡了。

链式的原则,也便是什么状况下才会对task进行链式操做呢?简单梗概一下:
 

上下游的并行度一致
下游节点的入度为1 (也就是说下游节点没有来自其余节点的输入)
上下游节点都在同一个 slot group 中(下面会解释 slot group)
下游节点的 chain 策略为 ALWAYS(能够与上下游连接,map、flatmap、filter等默认是ALWAYS)
上游节点的 chain 策略为 ALWAYS 或 HEAD(只能与下游连接,不能与上游连接,Source默认是HEAD)
两个节点间数据分区方式是 forward(参考理解数据流的分区)
用户没有禁用 chain

slot和parallelism


1.slot是指taskmanager的并发执行能力
在hadoop 1.x 版本中也有slot的概念,有兴趣的读者能够了解一下

taskmanager.numberOfTaskSlots:3

每个taskmanager中的分配3个TaskSlot,3个taskmanager一共有9个TaskSlot

2.parallelism是指taskmanager实际使用的并发能力

parallelism.default:1

运行程序默认的并行度为1,9个TaskSlot只用了1个,有8个空闲。设置合适的并行度才能提升效率。

3.parallelism是可配置、可指定的

1.能够经过修改$FLINK_HOME/conf/flink-conf.yaml文件的方式更改并行度

2.能够经过设置$FLINK_HOME/bin/flink 的-p参数修改并行度

3.能够经过设置executionEnvironmentk的方法修改并行度

4.能够经过设置flink的编程API修改过并行度

5.这些并行度设置优先级从低到高排序,排序为api>env>p>file.

6.设置合适的并行度,能提升运算效率

7.parallelism不能多与slot个数。

slot和parallelism总结

1.slot是静态的概念,是指taskmanager具备的并发执行能力

2.parallelism是动态的概念,是指程序运行时实际使用的并发能力

3.设置合适的parallelism能提升运算效率,太多了和太少了都不行

4.设置parallelism有多中方式,优先级为api>env>p>file

相关文章
相关标签/搜索