【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(特点和优势分析)

手把手+零基础带你玩转大数据流式处理引擎Flink(特点和优势分析)

  • 总体介绍
  • 状态容错
    • 精确的一次性处理模式
    • 简单场景的精确一次容错方法
    • 分布式状态容错
      • 容错恢复
        • 分散式快照(Distributed Snapshots)方法
        • Checkpoint barrier
      • 状态维护
      • Flink目前支持两种状态后端

总体介绍

本文介绍了Apache Flink的定义、架构、基本原理,并辨析了大数据流计算相关的基本概念。同时回顾了大数据处理方式的历史演进以及有状态的流式数据处理的原理。最后,分析了Apache Flink作为业界公认为最好的流计算引擎之一所具备的天然优势,旨在帮助读者更好地理解大数据流式处理引擎的基本概念,更好地应用Flink。

状态容错

精确的一次性处理模式

当我们考虑状态容错时,难免会想到精确一次的状态容错,它应用于运算时累积的状态。每个输入事件都反映到状态上,每次更改状态都是精确一次。如果修改超过一次,则数据引擎产生的结果就会变得不可靠。

  • 为了确保状态具有精确一次的容错保证,我们需要使用一些技术,例如记录每个状态更改的时间戳,并跟踪每个状态更改的来源。这些技术可以帮助我们检测和纠正任何重复的状态更改。

  • 在分布式场景下,我们需要为多个具有本地状态的运算子生成一个全局一致的快照。这可以通过使用一些分布式快照算法来实现,例如Chandy-Lamport算法或Distributed Snapshot Protocol。

  • 最重要的是,我们需要在不中断运算的前提下生成快照。这可以通过使用一些基于增量的快照算法来实现,例如基于增量的Chandy-Lamport算法或基于增量的Distributed Snapshot Protocol。这些算法允许我们在运算过程中生成快照,而不会影响运算的进行。

简单场景的精确一次容错方法

在以上场景中,如果某个使用者的出现次数计算不准确,那么产生的结果就无法作为参考。为确保状态容错的精度,在考虑容错保证之前,首先需要考虑最简单的使用场景:无限流的数据进入,通过单一的Process进行运算,每处理完一笔数据即会累积一次状态。为确保Process产生精确的状态容错,可以在每处理完一笔数据后,更改完状态后进行一次快照。将快照存储在队列中,并对相应的状态进行对比,以完成一致的快照。通过这种方式就能确保精确一次的状态容错。

分布式状态容错

在Flink中,由于是分布式的处理引擎,会涉及到多个本地状态的运算。如果想要在不中断运算值的前提下产生全域一致的快照,则需要进行分散式状态容错。

【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(特点和优势分析)_第1张图片
在分布式环境中,如果想要实现Global consistent snapshot,需要确保每一笔数据的快照点是连续的,并且所有运算值都能够被正确地处理、更改和维护状态。

这可以在多个节点上进行运算,每个节点都能获取全局快照并保存状态。这样,对于每一个运算值,都可以知道它的状态和位置,从而实现全局一致的快照。当然,这种方法在简单场景下也是适用的。

容错恢复

分散式状态容错 - 容错恢复:

  • 将数据源位置重新设定
  • 每一个运算元从检查点恢复状态
    【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(特点和优势分析)_第2张图片
    Checkpoint是一种机制,用于维护每个Operator运算值本地的状态,并将其传入共享的DFS中,以便在任何Process挂掉时,通过三个完整的Checkpoint恢复所有运算值的状态。这样可以确保整个Process能够在分散式环境中实现Exactly-once,即确保每一条消息仅仅被处理一次。Checkpoint机制的存在,保证了整个流程的高可用性和数据的可靠性。

分散式快照(Distributed Snapshots)方法

Flink使用基于simple lamport演算法机制的方法,在不中断运算的情况下持续产生Global consistent snapshot。这个方法通过在某个Datastream中安插Checkpoint barrier来实现,Checkpoint barrier会不断地插入到数据流中,形成N一1的结构,其中N代表所有在这个范围内的数据都是Checkpoint barrier N。这种方法可以保证数据流的高可用性和数据的可靠性,同时降低了重复率。
【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(特点和优势分析)_第3张图片
分散式快照(Distributed Snapshots)

【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(特点和优势分析)_第4张图片
在Flink中,产生Checkpoint是由job manager触发的,Checkpoint的触发会从数据源开始产生Checkpoint barrier。当开始做Checkpoint barrier N时,可以将其视为需要逐步填充左下角的表格。 【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(特点和优势分析)_第5张图片

如图,若将部分事件标为红色,同时Checkpoint barrier N也是红色,则这些数据或事件都由Checkpoint barrier N负责,而Checkpoint barrier N后面白色部分则不属于它的管辖范围。

Checkpoint barrier

根据上述规则,当数据源收到Checkpoint barrier N后,它会先保存自己的状态,比如读取Kafka资料时,它会保存自己在Kafka分区的读取进度,并将此状态写入上文提到的表格中。在此之后,数据源会将数据发送给下游,下游会根据这个状态来读取数据,从而实现数据的顺序性。

当Checkpoint barrier N到达下游Operator1时,它会对属于Checkpoint barrier N的所有数据进行运算,并将运算结果更新到状态中。在这之后,Operator1也会将这些数据的处理结果一起写入到Checkpoint中。同时,当Operator1接收到Checkpoint barrier N时,也会将状态快照保存到Checkpoint中。

【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(特点和优势分析)_第6张图片
当完成快照后,下游的Operator2接收到所有数据并搜索Checkpoint barrier N的数据,并将其反映到状态中。当状态接收到Checkpoint barrier N时,也会将其写入到Checkpoint N中。

这样,完成以上过程后就得到了一个名为Distributed Snapshots(分布式快照)的表格。分布式快照可用于状态容错,因为如果某个节点发生故障,可以从早期的Checkpoint中恢复。当多个Checkpoint同时进行时,如Checkpoint N+1和Checkpoint N+2等,Flink job manager可以触发它们的生成。利用这种机制,可以在不阻塞运算的情况下持续地生成Checkpoint。

状态维护

状态维护即用一段代码在本地维护状态值,当状态值非常大时需要本地的状态后端来支持。

【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(特点和优势分析)_第7张图片
在Flink程序中,可以使用getRuntimeContext().getState(desc) API注册状态。Flink支持多种状态后端,而通过状态后端读取状态值是在API注册状态后实现的。Flink有两种不同类型的状态值,以及两种不同类型的状态后端。

【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(特点和优势分析)_第8张图片
JVM Heap状态后端适用于状态比较小的情况,可以在每次需要读取状态时使用Java对象读写操作读取或写入状态值,因此不会产生较大的代价。但是当需要将本地状态放入分布式快照时,就需要进行序列化操作。

【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(特点和优势分析)_第9张图片
RocksDB状态后端是一种out-of-core的状态后端,可以将状态维护在磁盘中,因此在需要读取状态时可能需要进行序列化和反序列化的过程。当需要进行快照时,仅需序列化应用数据,并直接将序列化后的数据传输到中央共享DF$中即可。相较于在Runtime本地状态后端维护状态的情况,RocksDB可以大大降低对内存的消耗,适合大规模需求的状态存储。

Flink目前支持两种状态后端

纯内存的状态后端和具有资源磁盘的状态后端。用户可以根据状态数量的多少,选择采用较为适合的状态后端。纯内存的状态后端维护状态时速度较快,但会在状态量较大时消耗过多的内存资源。而具有资源磁盘的状态后端则可以在状态量较大时将状态数据放在磁盘中进行维护,从而减少对内存的消耗。用户可根据不同的应用场景,选择性地采用适合的状态后端,以达到更好的性能。

你可能感兴趣的:(【全方位技术攻关】浩宇天尚,flink,java,大数据)