- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Flink 执行图
- StreamGraph
- 流程化:最初的程序执行逻辑流程,也就是算子之间的前后顺序
- 在Client上生成
- JobGraph
- 将OneToOne的Operator合并为OperatorChain
- 在Client上生成
- ExecutionGraph
- 将JobGraph根据代码中设置的并行度和请求的资源进行并行化规划
- 在JobManager上生成
- 物理执行图
- 将ExecutionGraph的并行计划落实到具体的TaskManager上,将具体的SubTask落实到具体的TaskSlot内进行
Flink On Yarn 模式
原理
为什么使用flink on yarn
- Yarn的资源可以按需使用,提高集群的资源利用率
- Yarn的任务有优先级,根据优先级运行作业
- 基于Yarn调度系统,能够自动化的处理各个角色的Failover
- JobManager进程和TaskManager进程都由Yarn NodeManager 监控
- 如果JobManager进程异常退出,则Yarn ResourceManager会重新调度JobManager到其他机器
- 如果TaskManager进程异常退出,JobManager会收到消息并重新向Yarn ResourceManager申请资源,重新启动TaskManager
概念
- DataFlow:Flink程序在执行的时候会被映射成一个数据流模型
- Operator:数据流模型中的每一个操作被称作Operator,Operator分为:Source、Transform、Sink
- Partition:数据流模型是分布式的和并行的,执行中会形成1-n个分区
- SubTask:多个分区任务可以并行,每一个都是独立运行在一个线程中的,也就是一个SubTask子任务
- Parallelism:并行度,就是可以同时真正执行的子任务数/分区数
数据传递模式
- One to One 模式: 两个operator用此模式传递的时候,会保持数据的分区数和数据的排序。--类似spark中的窄依赖
- Redistributing模式: 这种模式会改变数据的分区数,每一个operator subtask会根据选择transformation把数据发送到不同的目标subtask,比如keyby会通过hashcode重新分区,broadcast和rebalance方法会随机重新分区。--类似spark中的宽依赖
//全部发往第1个task
DataStream<Tuple2<String, Integer>> result1 = tupleDS.global();
//广播
DataStream<Tuple2<String, Integer>> result2 = tupleDS.broadcast();
//上下游并行度一样时一对一发送
DataStream<Tuple2<String, Integer>> result3 = tupleDS.forward();
//随机均匀分配
DataStream<Tuple2<String, Integer>> result4 = tupleDS.shuffle();
//Round-Robin轮流分配
DataStream<Tuple2<String, Integer>> result5 = tupleDS.rebalance();
//Local Round-Robin本地轮流分配
DataStream<Tuple2<String, Integer>> result6 = tupleDS.rescale();
//自定义单播
DataStream<Tuple2<String, Integer>> result7 = tupleDS.partitionCustom(new MyPartitioner(), t -> t.f0);
状态管理
Managed State
- Flink Runtime 管理:自动存储,自动恢复/内存管理上有优化
- 数据结构:value/list/map
- 大多数情况下均可使用
Keyed State & Operator State
Managed State 分为两种:Keyed State 和Operator State(Raw State 都是Operator State)
- Keyed State
- 只能用在KeyedStream上的算子中
- 每个Key对应一个State:一个Operator实例处理多个Key,访问相应的多个State
- 并发改变,State随着Key在实例间迁移
- 通过RuntimeContext访问:Rich Function
- 支持的数据结构:ValueState/ListState/ReducingState/AggregatingState/MapState
- Operator State
- 可以用于所有算子:常用于source,例如FlinkKafkaConsumer
- 一个Operator实例对应一个State
- 并发改变时有多种重新分配方式可以选:均匀分配/合并后每个得到全量
- 实现CheckpointedFunction或ListCheckpointed接口
- 支持的数据结构:ListState
Raw State
- 用户自己管理,需要自己序列化
- 数据结构:字节数据,byte[]
- 自定义Operator时可使用