flink 和spark 的比较
flink
- fink 支持轻量级分布式快照snapshot 实现容错
- 支持带丰富事件、时间的窗口window 状态操作:time,session.count,data-driven
- 程序自动优化,避免特定情况下shuffle,排序等代价操作,中间结果自动缓存优化
- flink taskslot 中对内存进行隔离,cpu是共享的。
- 自动反压,不需要配置
spark - 流计算是基于微批处理的流处理,延迟较高
- 算子上,spark 是算子是分为宽依赖和窄依赖,算子分组成stage,stage需要等上个stage完成才能执行下一个stage。flink 的会在一个节点处理完成后,会发送到下个节点立即处理,延迟更小。
flink 架构
- client
提交任务,优化代码逻辑,有效减轻jobmanager的任务 - jobmanger(driver)
包含ResourceManager,Dispatcher,JobMaster启动会启动一个web服务器,web Frontend前端。 - taskmanger(work)
一个work就是一个taskmanager ,上有多个taskslot 就是JVM 进程,运行多个task线程。每个 taskmanager只对内存进行隔离,cpu不进行隔离。 - TaskSlot (executor)
jobmanager 是以taskslot 调度task 任务的,一般配置成机器的核数,taskslot代表并发任务数,多个操作也可以在一个tasklot中执行(操作链)。 - 通信组件
akka actor
akka.ask.timeout=10s 默认值 - blob 服务器
接收客户端jar,发送给taskmanager,传输log等作用
通信netty
技术栈
部署模式
standalone cluster 和伪分布模式
./bin/start-cluster.sh 启动flink集群
./bin/stop-cluster.sh 关闭flink集群
yarn 集群模式
运行方式有四种
-
flink yarn-session + flink run
在yarn 集群中启动一个flink 会话,这个会话可以提交多个job上,所以的job占用功能的资源
./bin/yarn-session.sh -n 4 -jm 1024 -tm 4096 #n是 taskslot 数量,jm 内存大小,tm 内存大小
./bin/flink run ./examples/batch/WordCount.jar 会提交到yarn session上 -
flink run yarn-cluster
在yarn上启动单独的任务资源隔离,各个任务之间资源隔离
./bin/flink run -m yarn-cluster -yn 2 ./examples/batch/WordCount.jar -
flink run yarn-client
在client 提交的节点上生成,会与jobmanager交互信息
./bin/flink run -m yarn-client -yn 2 ./examples/batch/WordCount.jar -
flink run-application
/bin/flink run-application -t yarn-application ./examples/batch/WordCount.jar
main方法预处理在jobmanager执行
参数优化
并行度设置
注意
实际申请的taskmanager和container的数量不等于预先参数配置的数量,最终由-p决定。
#./bin/flink run -p 3 -yn 3 -yjm 2048 -ys 2 -ytm 1024 -m yarn-cluster -c DataStreamingTest /home/master/conf/Flink8Test.jar
yarn 上 3个container,一个container是AM和jobmanager,另外2个container是taskmanager,cup3个,内存 2048+2*1024=4GB
Flink上 分配2个taskmanager,taskslot 是4个,最大并行度3,空闲的slot 是1个
#./bin/flink run -p 4 -yn 3 -yjm 2048 -ys 2 -ytm 1024 -m yarn-cluster -c DataStreamingTest /home/master/conf/Flink8Test.jar
yarn 上 3个container,一个container是AM和jobmanager,另外2个container是taskmanager,cup3个 Flink上 分配2个taskmanager,taskslot 是4个,最大并行度4,空闲的slot 是0个
官方建议 taskmanager.numberOfTaskSlots配置的Slot数量和CPU相等或成比例
# 如何提高container的cup核数
每个taskmanger是共享cup和io等资源,内存是隔离的
yarn.containers.vcores -1
taskmanager.numberOfTaskSlots
优化方向
- 设置并行度
p参数,只能同时运行的taskslot的并行度数量
操作算子层面(Operator Level)
执行环境层面(Execution Environment Level)
客户端层面(Client Level)
系统层面(System Level) - 自定义分区
rebanlance
rescale
shuffle
broadcast - 网络通信
通信网络,直接影响交换数据的速度和任务执行的效率 - 其他方式
设置不同服务器之间缓冲区超时时长,-1表示直到满才刷新,0表示一旦接收立即刷新env.setBufferTimeout(timeoutMillis)
尽量少用并行度低的算子,WindowAll,count