Flink 集群部署、任务提交及运行时架构

集群部署

flink-conf.yaml

jobmanager.rpc.address:localhost
jobmanager.rpc.port:6123
#jobmanager堆内存大小
jobmanager.heap.size:1024m
#任务内存大小
taskmanager.memory.process.size:1728m
#槽位
taskmanager.numberOfTaskSlots:1
#并行度
parallelism.default:1

masters

hadoop1

slaves

hadoop2
hadoop3

集群启动

./bin/start-cluster.sh

集群停止

./bin/stop-cluster.sh

yarn部署
1.session cluster
./yarn-session.sh -n 2 -s 2 -jm 1024 -tm 1024 -nm test -d
2.per-job-cluser
./flink run -m tarn-cluster -c com.xxx.xxx
k8s部署
1.搭建k8s集群
2.配置各组件的yaml文件。包括jobManager、TaskManager、JobManagerService三个镜像服务
3.启动flink session cluster
kubectl create -f jobmanager-service.yaml
kubectl create -f jobmanager-deployment.yaml
kubectl create -f taskManager-deployment.yaml

任务命令

启动job任务 bin/flink run -c com.ch.xxx.xxxx.stream -p 10 xxx.jar
查看job任务列表 bin/flink list
取消job任务 bin/flink cancel ${jobid}

运行时架构

flink运行时的四大组件
作业管理器(JobManager)
控制一个应用程序执行的主进程。
接受应用程序,包括作业图,逻辑数据流图和打包的所有类、库和jar包
把作业图转换成物理层面的数据流图(执行图)
向资源管理器申请资源(向taskManager申请slot),协调checkpoint

任务管理器(TaskManager)
flink中的工作进程。通常在Flink中会有多个TaskManager运行,每一个TM都包含一定数量的插槽(slot)。插槽的数量限制了TM能够执行的任务数量。
启动之后,TM会向资源管理器注册它的插槽;收到资源管理器的指令后,TM就会将一个或者多个插槽提供给JobManager调用。JM就可以向插槽分配任务(tasks)来执行了。
在执行过程中,一个TM可以跟其他运行同一应用程序的TM交换数据

资源管理器(ResourceManager)
主要负责管理 任务管理器(TaskManager)的插槽(slot),TM插槽是Flink中定义的处理资源单元
Flink为不同的环境和资源管理工具提供了不同资源管理器,比如yarn,mesos,k8s,以及standalone部署
当JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TM分配给JM。如果RM没有足够的插槽来满足JM的请求,它还可以向资源提供平台发起会话,以提供启动TM进程的容器

分发器(Dispatcher)
可以跨作业运行,它为应用提交提供了REST接口
当一个应用被提交执行时,分发器就会启动并将应用移交给一个JM
Dispatcher也会启动一个WebUI,用来方便地展示和监控作业执行的信息
Dispatcher在架构中可能并不是必须的,这取决于应用提交运行的方式

任务提交流程
1.App提交应用到Dispatcher
2.Dispatcher启动并提交应用到JobManager
3.JobManager向ResourceManager请求slots
4.ResourceManager向TaskManager发送启动请求
5.TaskManager向ResourceManager注册slots
6.ResourceManager向TaskManager发出提供slot的指令
7.TaskManager向JobManager提供slots
8.JobManager向TaskManager提交要在slots中执行的任务
9.TaskManager交换数据

任务调度原理
怎样实现并行计算?
分配到不同的slot上
并行的任务需要占用多少个slot?
一个流处理程序到底包含多少个任务?

并行度:一个特定算子的子任务的个数
slot:独享内存
taskManager:JVM进程,它可以在独立的线程上执行一个或多个子任务
子任务slot可以共享,slot使用量即为任务的最大并行度
子任务可以设置Parallelism并行度,可以设置slotSharingGroup共享组,不同组之间slot不能共享

程序与数据流(DataFlow)
所有的flink程序都是由三部分组成的:Source、Transformation、Sink
每一个DataFlow以一个或多个source开始 以一个或多个结束的有向无环图(DAG)

StreamGraph->JobGraph->ExecutionGraph->物理执行图
StreamAPI编写代码生成的图->优化后提交给JobManager的数据结构
->并行化版本,调度最核心的数据结构->各个TaskManager部署Task形成的图,不是一个具体的数据结构

怎么才能合并:相同并行度的同组的one-to-one
one-to-one:map、fliter、flatMap
Redistributing:keyBy、broadcast、rebalance

怎么拆:
设置共享组
添加重分区操作
.disableChaining()
.disableOperatorChaining() (全局)
.startNewChain()

你可能感兴趣的:(Flink 集群部署、任务提交及运行时架构)