flink1

一、flink集群部署
(一)、standalone方式

flink-1.9.2  搭配  jdk-1.8.0_271
1、cd flink_1.10.1
2、cd conf
3、vim flink-conf.ymal
注:jobmanager:spark中的driver,管理job,生成执行图,将任务分配给taskmanager,是一个jvm进程
    taskmanager:worker,spark中的executor,job将task分配给taskmanager,真正干活的,也是一个jvm进程
    slot每个任务要分配到slot上【一个slot会被分配一个任务】,taskmanager可以有多个task,每个slot就是一个计算资源
    parallelism:并行度,默认是1【方法<---->算子<---->操作<--->operator】,优先级:算子单独定义>环境【env.setParallelism(8)】>web管理端中的定义>flink集群环境中的配置
4、start-cluster.sh
    会有两个进程:standalonesessionEntrypoint【提交job的入口点】 和 taskexecutor
5、vim master 【localhost:8081】对应jobmanager
6、vim slave 【localhost】对应taskmanager
7、网页管理端:localhost:8081
8、提交job
a、打包上传
b、配置入口


c、执行计划【任务中bytes received 转圈,说明slot资源不够】

d、命令方式提交job:./bin/flink run -c 类的全限定名 -p 并行度 /jar包路径 --host localhost --port 7777【main方法参数】
e、命令方式终止job:./bin/flink cancel jobId
f、查看所有job:./bin/flink list -a

(二)、Yarn 模式 
前提:flink版本要支持hadoop
1、yarn session模式:
2、pre-yarn-cluster模式:每个job会独占一个flink-cluster资源
(三)、Kubernetes 模式 
1、在k8s上构建Flink Session Cluster,需要将Flink集群的组件对应的docker镜像,分别在k8s上启动,包括 JobManager 、 TaskManager 、 JobManagerService 三个镜像服务。每个镜像服务都可以从中央镜像仓库中获取。

二、Flink 运行时的组件

1、作业管理器(JobManager):分析代码,生成执行计划图,分配任务
a、JobManager会先接收到要执行的应用程序,这个应用程序会包括:作业图( JobGraph )、逻辑数据流图 logical dataflow graph )和打包了所有的类、库和其它资源的JAR包。
b、会把JobGraph转换成一个物理层面的数据流图,这个图被叫做执行图ExecutionGraph,包含了所有可以并发执行的任务。
2、资源管理器(ResourceManager):最小资源单位【slot】
3、任务管理器(TaskManager):每个taskmanager一个进程,干活的。整个集群静态的并行计算的能力【slot总个数】=taskmanager个数*slot个数
4、分发器(Dispatcher):提供任务提交等接口,启动一个webUI,在架构中不是必须的

5、任务提交流程

三、任务调度原理

1、任务调度过程
a、flink-task1.jar【采用sacla链式调用的方式定义好了数据处理的流程】---->dataflow graph【数据流图,有些任务是合在一起的】--->jab graph
b、jobmanager收到job graph及相关jar包---->判断任务的并行度,每个任务下有几个并行的子任务,统计一共有多少个任务---->去sourceManager申请资源---->
2、qa
a、怎样实现并行计算(parallelism)?
每个方法(算子)都有parallelism。
b、并行的任务,需要占多少slot?

c、一个流处理程序,到底包含多少个任务?
3、并行度(parallelism)
a、一个steam的并行度,就是所有算子中最大的并行度,如图:stream的并行度就是2,且该stream至少需要2个slot去执行

4、taskManager和slot
a、一个slot可以接收一个任务
b、不同的子任务可以合并成一个,如图的source和map就合并成了一个
c、允许将前后发生的不同的任务放到一个slot中

5、并行子任务的分配

6、subtask、task、operator chains、slot概念

Task:Tas 是一个阶段多个功能相同subTask的集合,类似于Spark中的 TaskSet。
subTask:subTask是Flink中任务最小执行单元,是一个 Java类的实例,这个Java 类中有属性和方法,完成具体的计算逻辑。
Operator Chains:没有 shuffle 的多个算子合并在一个 subTask 中,就形成了Operator Chains,类似于Spark中的 Pipeline。
Slot:Flink中计算资源进行隔离的单元,一个 Slot中可以运行多个subTask,但是这些subTask必须是来自同一个application的不同阶段的subTask。

同一个application,多个 task的 subTask,可以运行在同一个slot资源槽中;但是同一个 task 中的多个 sub-task不能运行在一个 slot 资源槽中,他们会被分散到不同的slot中。这就限制了我们的任何一个算子的并行度不能设置的超过集群总slot的数量,否则集群不能正常的运行。

6、程序与数据流(DataFlow)
a、所有的Flink程序都是由三部分组成的:Source 、Transformation和Sink 。
b、Source负责读取数据源,Transformation利用各种算子进行处理加工,Sink负责输出。

7、数据传输形式(operator)
Stream在算子之间传输数据的形式可以是one-to-one(forwarding) 的模式也可以是redistributing的模式,具体是哪一种形式,取决于算子的种类,和相邻算子的并行度。
a、one-to-one【两个相邻的算子的并行度相同】、map 、fliter 、flatMap等算子都是one-to-one的对应关系。这种情况两个任务就能合并成一个【可以减少数据传输和序列化反序列化】。
b、redistributing【重分区】。【两个相邻的算子的并行度不同】【或】【keyBy()基于hashCode重分区、broadcast和rebalance会随机重新分区,这些算子都会引起redistribute过程】。

8、不参与任务合并
a、.disableChaining()---->表示该算子【方法】【子任务】不与其他子任务合并,单独作为一个任务。全局切断env.disableOperationChaining()
b、.startNewChain()---->表示该算子【方法】【子任务】新启动一个任务

9、slot不共享
a、.slotSharingGroup("xx"【默认是default】)----->表示该算子【方法】【子任务】所用的slot只是自己用,不与其他任务共享
问题:slot不共享,是不是任务就不会合并了?????

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值