Flink 小知识记录

248 阅读3分钟

Flink 执行图

  • StreamGraph
  1. 流程化:最初的程序执行逻辑流程,也就是算子之间的前后顺序
  2. 在Client上生成
  • JobGraph
  1. 将OneToOne的Operator合并为OperatorChain
  2. 在Client上生成
  • ExecutionGraph
  1. 将JobGraph根据代码中设置的并行度和请求的资源进行并行化规划
  2. 在JobManager上生成
  • 物理执行图
  1. 将ExecutionGraph的并行计划落实到具体的TaskManager上,将具体的SubTask落实到具体的TaskSlot内进行

截屏2021-10-18 上午11.23.03.png

Flink On Yarn 模式

原理

截屏2021-10-18 上午11.48.09.png

为什么使用flink on yarn

  1. Yarn的资源可以按需使用,提高集群的资源利用率
  2. Yarn的任务有优先级,根据优先级运行作业
  3. 基于Yarn调度系统,能够自动化的处理各个角色的Failover
    • JobManager进程和TaskManager进程都由Yarn NodeManager 监控
    • 如果JobManager进程异常退出,则Yarn ResourceManager会重新调度JobManager到其他机器
    • 如果TaskManager进程异常退出,JobManager会收到消息并重新向Yarn ResourceManager申请资源,重新启动TaskManager

概念

  1. DataFlow:Flink程序在执行的时候会被映射成一个数据流模型
  2. Operator:数据流模型中的每一个操作被称作Operator,Operator分为:Source、Transform、Sink
  3. Partition:数据流模型是分布式的和并行的,执行中会形成1-n个分区
  4. SubTask:多个分区任务可以并行,每一个都是独立运行在一个线程中的,也就是一个SubTask子任务
  5. Parallelism:并行度,就是可以同时真正执行的子任务数/分区数

数据传递模式

  1. One to One 模式: 两个operator用此模式传递的时候,会保持数据的分区数和数据的排序。--类似spark中的窄依赖
  2. 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)

  1. Keyed State
    • 只能用在KeyedStream上的算子中
    • 每个Key对应一个State:一个Operator实例处理多个Key,访问相应的多个State
    • 并发改变,State随着Key在实例间迁移
    • 通过RuntimeContext访问:Rich Function
    • 支持的数据结构:ValueState/ListState/ReducingState/AggregatingState/MapState
  2. Operator State
    • 可以用于所有算子:常用于source,例如FlinkKafkaConsumer
    • 一个Operator实例对应一个State
    • 并发改变时有多种重新分配方式可以选:均匀分配/合并后每个得到全量
    • 实现CheckpointedFunction或ListCheckpointed接口
    • 支持的数据结构:ListState

Raw State

  • 用户自己管理,需要自己序列化
  • 数据结构:字节数据,byte[]
  • 自定义Operator时可使用