美文网首页
基于Apache Flink的流处理 第三章 Apache Fl

基于Apache Flink的流处理 第三章 Apache Fl

作者: kaiker | 来源:发表于2021-09-20 17:03 被阅读0次

    1、Flink组件

    FLink组件交互

    JobManager

    • 控制单个应用程序的执行
    • JAR发送给JobManager,Dataflow图由JobManager转换为ExecutionGraph
    • 负责从ResourceManager申请任务资源;TaskManager会发送消息给JobManager是否有足够资源,足够了就会分发任务给TaskManager
    • 负责创建检查点
    • 可靠性保障:将JobGraph以及全部所需的元数据写入远程持久化存储系统中;JobManager还会将存储位置的路径地址写入ZooKeeper的数据存储。

    ResourceManager

    • 负责管理TaskManager的资源单元(slot)
    • JobManager申请资源的时候,ResourceManager指示TaskManager将处理槽提供给JobManager

    TaskManager

    • 提供一定数量的处理槽,处理槽的树木限制了一个TaskManager可执行的任务数
    • TaskManager启动后,会向ResourceManager注册它的处理槽
    • 收到ResourceManager指示后,会向JobManager提供插槽

    Dispatcher

    • 提供了一个REST接口用于应用提交
    • 一旦应用提交执行,Dispatch会启动一个JobManager并将应用转交

    2、任务执行

    • 一个TaskManager允许同时执行多个任务。这些任务可以属于同一个算子,也可以是不同算子。
    • 比如下图中A分布到了四个插槽里
    • 多个任务可以在同一进程内高效地执行数据交换无需访问网络
    算子、任务以及插槽

    3、高可用性

    • TaskManager故障。如果故障了JobManager会向ResourceManager申请更多的处理槽。无法请求到足够的槽就不会重启。
    • JobManager故障。在高可用模式下,会将JobGraph以及全部所需的元数据写入一个远程持久化存储系统中。还会将存储位置的路径地址写入ZooKeeper的数据存储。
    • 恢复时会向ZooKeeper请求存储位置,获取JobGraph、JAR文件以及应用最新检查点在远程存储的状态句柄;然后向ResourceManager申请槽来继续执行,重启并利用最近一次检查点重置任务状态。

    4、Flink中的数据传输

    TaskManager之间的数据传输
    • TaskManager之间有用于首发数据的网络缓冲池,每个缓冲默认32KB
    • 同一个TaskManager内不同任务之间的数据传输不会涉及网络通信

    5、事件时间处理

    5.1 时间戳

    • 在事件时间模式下,Flink流式应用处理的所有记录都必须包含时间戳
    • Flink内部采用8字节的Long值对时间戳进行编码,并将他们以元数据的形式附加在记录上

    5.2 水位线

    • 水位线用于在时间时间应用中推断每个任务当前的事件时间。
    • 水位线必须单调递增,和记录的时间戳存在联系。
    • 水位线应该是数据携带的(有点忘了,但是可以参考extractTimestamp代码的逻辑),不指定是没有的,一般把水位线指定为当前这个数据事件时间晚一点。如果开了一个窗口,其实结束触发窗口的时候,来的这个事件真实事件时间已经是窗口结束时间之后一段时间了(processtime=202207271410, watermark=202207271405),这时候trigger触发了,窗口里的state都计算好,而在无乱序的情况下,真实时间小于水位(202207271405)的事件都应该到了,现在已经消费到202207271410了。
    水位线
    • 任务内部的时间服务会维护一些计时器,它们依靠水位线来激活。
    • 当任务接收到水位线时会执行:更新内部事件时间始终,触发所有时间小于更新后事件时间的计时器,调用回调函数。
    • 一个任务会为他的每个输入分区维护一个分区水位线,收到某个分区传来的水位线后,会更新对应分区的水位线,然后任务会把事件时间调整为所有分区最小值。
    水位线更新任务事件时间
    • 利用所有分区中最小的水位线来触发时间时钟
    • 较快的流的记录或中间结果会在状态中缓存

    6、状态管理

    • 可以认为状态是业务逻辑所需访问的本地或实例变量
    • 任务会根据数据不断对状态进行读取或更新,并根据状态和输入数据计算结果
    • 有了状态就可以保存一些中间计算的结果
    带有状态的流处理任务

    6.1 算子状态

    算子状态的作用域是某个算子任务,flink为算子状态提供了三类,列表状态、联合列表状态、广播状态

    6.2 键值分区状态

    键值分区状态任务

    常见状态包括单值状态、列表状态、映射状态。
    其实就是在流式计算中可访问一个中间结果,并根据中间结果继续计算

    6.3 状态后端

    用来管理本地状态和将状态写入远程存储

    7、检查点、保存点及状态恢复

    7.1 一致性检查点

    有状态的流式应用的一致性检查点是在所有任务处理完等量的原始输入后对全部任务状态进行的一个拷贝

    7.2 flink检查点算法

    • flink使用检查点分隔符特殊记录,会通过数据源算子注入到常规记录流中。
    • 所有先于分隔符的记录所引起的状态更改都会被包含在分隔符所对应的检查点之中。
    三角形是检查点,这两个流一个处理奇数一个处理偶数 数据源3,4先记录到检查点 检查点广播到所有算子,没都收到就不会记录,新来的数据进行缓冲,检查点之前的数据正常传递 收到了之后就记录,然后数据就恢复正常处理

    7.3 保存点

    • 检查点周期性地生成,会根据配置的策略自动丢弃
    • 保存点生成逻辑与检查点相同,但是保存点由用户显示触发

    相关文章

      网友评论

          本文标题:基于Apache Flink的流处理 第三章 Apache Fl

          本文链接:https://www.haomeiwen.com/subject/ufktgltx.html