【大数据】计算引擎之七:Flink处理框架

1.是什么?

Apache Flink是一种可以处理批处理任务的流处理框架。该技术可将批处理数据视作具备有限边界的数据流,借此将批处理任务作为流处理的子集加以处理。为所有处理任务采取流处理为先的方法会产生一系列有趣的副作用。

  这种流处理为先的方法也叫做Kappa架构,与之相对的是更加被广为人知的Lambda架构(该架构中使用批处理作为主要处理方法,使用流作为补充并提供早期未经提炼的结果)。Kappa架构中会对一切进行流处理,借此对模型进行简化,而这一切是在最近流处理引擎逐渐成熟后才可行的。

1.主要概念:

Job ManagersTask ManagersClients

Flink的运行时,由两种类型的进程组成:

  • JobManagers: 也就是masters ,协调分布式任务的执行 。用来调度任务,协调checkpoints,协调错误恢复等等。至少需要一个JobManager,高可用的系统会有多个,一个leader,其他是standby
  • TaskManagers: 也就是workers,用来执行数据流任务或者子任务,缓存和交互数据流。 至少需要一个TaskManager
  • Client: Client不是运行是和程序执行的一部分,它是用来准备和提交数据流到JobManagers。之后,可以断开连接或者保持连接以获取任务的状态信息。

2watermark有什么用?

watermark是用于处理乱序事件的,而正确的处理乱序事件,通常用watermark机制结合window来实现。

我们知道,流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络、背压等原因,导致乱序的产生(out-of-order或者说late element)。

但是对于late element,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了。这个特别的机制,就是watermark。

3.Flink框架的整体架构

  • Deploy层
    • Local:本地JVM进程中运行Flink程序
    • Cluster:集群中运行Flink程序,分独立集群和Yarn集群(公司统一集群)
  • API层
    • DataStream:Flink提供的流处理API
    • DataSet:Flink提供的批处理API
    • Table:Flink提供的高级API,可以直接写类似SQL的代码来计算数据

4.Flink中的数据流模型:Source -> Transformation -> Sink

5.四个窗口

CountWindow: 按条数切分数据(也分滚动、滑动),每1000次点击中下单数统计等。

  • TimeWindow
    • TumblingWindow
    • 滚动窗口,按固定时间切分数据,无重叠
    • 每个时间段的聚合计算,BI报表
  • SlidingWindow
    • 滑动窗口,按固定时间和滑动间隔切分,有重叠
    • 最近一段时间范围统计,系统监控
  • SessionWindow
    • 会话窗口,按两条记录时间差来切分数据
    • 活跃期用户量等

6.Time类型及解释

  • EventTime:事件发生时间
  • IngestionTime:数据到来时间
  • ProcessingTime:数据处理时间(默认)

7.Flink中容错性

  • Savepoint机制:手动触发的checkpoint,可以指定存储路径,下次启动时可以从savepoint处执行
  • Checkpoint机制:用户可以根据的程序里面的配置将checkpoint打开,给定一个时间间隔后,框架会按照时间间隔给程序的状态进行备份。当发生故障时,Flink会将所有Task的状态一起恢复到Checkpoint的状态。从哪个位置开始重新执行。

8.Flink状态管理

  • state backend方式
    • MemoryStateBackend: 将状态数据保存到内存中,存储受限,推荐测试时使用,线上不推荐
    • FsStateBackend: 将状态数据保存到文件系统中,单TaskManager不超过内存,总存储不超过文件系统容量,如分钟级统计
    • RocksDBStateBackend:将状态数据保存到缓存中,缓存存不下,会持久化一部分到磁盘,如天级别统计
  • 当节点接收到barrier时,将自己的状态进行快照存储在配置好的state backend中,节点确认存储好之后,将barrier输出,下一个节点进行同样的操作,直到所有的节点都完成快照。source节点存储的是offset/position,其它节点存储的是指向快照的指针

9.数据的准确性控制

  • Flink中端到端的exactly-once保证:两阶段提交
    •    
      • 在data sink中要保证Exactly-Once语义,它必须将所有的写入数据通过一个事务提交到Kafka。在两个checkpoint之间,一个提交绑定了所有要写入的数据。
        这保证了当出错的时候,写入的数据可以被回滚。
        然而在分布式系统中,通常拥有多个并行执行的写入任务,简单的提交和回滚是效率低下的。为了保证一致性,所有的组件必须先达成一致,才能进行提交或者回滚。Flink使用了两阶段提交协议以及预提交阶段来解决这个问题。
      • 预提交阶段:
        • 在checkpoint开始的时候,即两阶段提交中的预提交阶段。首先,Flink的JobManager在数据流中注入一个checkpoint barrier,barrier通过operator传递。对于每一个operator,它将触发operator的状态快照写入到state backend。当checkpoint barrier在所有operator中都传递了一遍,以及它触发的快照写入完成,预提交阶段结束。
      • 提交阶段:
        • Jobmanager为程序中的每一个operator发起checkpoint已经完成的回调。data source和window operator没有外部的状态,在提交阶段中,这些operator不会执行任何动作。data sink拥有外部状态,所以通过事务提交外部写入。
        • 外部状态通常由需要写入的外部系统引入,例如Kafka。因此,为了提供Exactly-Once保证,外部系统必须提供事务支持。

2.怎么干?

  

流处理模型

  Flink的流处理模型在处理传入数据时会将每一项视作真正的数据流。Flink提供的DataStream API可用于处理无尽的数据流。Flink可配合使用的基本组件包括:

  • Stream(流)是指在系统中流转的,永恒不变的无边界数据集

  • Operator(操作方)是指针对数据流执行操作以产生其他数据流的功能

  • Source(源)是指数据流进入系统的入口点

  • Sink(槽)是指数据流离开Flink系统后进入到的位置,槽可以是数据库或到其他系统的连接器

      为了在计算过程中遇到问题后能够恢复,流处理任务会在预定时间点创建快照。为了实现状态存储,Flink可配合多种状态后端系统使用,具体取决于所需实现的复杂度和持久性级别。

      此外Flink的流处理能力还可以理解“事件时间”这一概念,这是指事件实际发生的时间,此外该功能还可以处理会话。这意味着可以通过某种有趣的方式确保执行顺序和分组。

      批处理模型

      Flink的批处理模型在很大程度上仅仅是对流处理模型的扩展。此时模型不再从持续流中读取数据,而是从持久存储中以流的形式读取有边界的数据集。Flink会对这些处理模型使用完全相同的运行时。

      Flink可以对批处理工作负载实现一定的优化。例如由于批处理操作可通过持久存储加以支持,Flink可以不对批处理工作负载创建快照。数据依然可以恢复,但常规处理操作可以执行得更快。

      另一个优化是对批处理任务进行分解,这样即可在需要的时候调用不同阶段和组件。借此Flink可以与集群的其他用户更好地共存。对任务提前进行分析使得Flink可以查看需要执行的所有操作、数据集的大小,以及下游需要执行的操作步骤,借此实现进一步的优化。

3.优势和局限

  Flink目前是处理框架领域一个独特的技术。虽然Spark也可以执行批处理和流处理,但Spark的流处理采取的微批架构使其无法适用于很多用例。Flink流处理为先的方法可提供低延迟,高吞吐率,近乎逐项处理的能力。

  Flink的很多组件是自行管理的。虽然这种做法较为罕见,但出于性能方面的原因,该技术可自行管理内存,无需依赖原生的Java垃圾回收机制。与Spark不同,待处理数据的特征发生变化后Flink无需手工优化和调整,并且该技术也可以自行处理数据分区和自动缓存等操作。

  Flink会通过多种方式对工作进行分许进而优化任务。这种分析在部分程度上类似于SQL查询规划器对关系型数据库所做的优化,可针对特定任务确定最高效的实现方法。该技术还支持多阶段并行执行,同时可将受阻任务的数据集合在一起。对于迭代式任务,出于性能方面的考虑,Flink会尝试在存储数据的节点上执行相应的计算任务。此外还可进行“增量迭代”,或仅对数据中有改动的部分进行迭代。

  在用户工具方面,Flink提供了基于Web的调度视图,借此可轻松管理任务并查看系统状态。用户也可以查看已提交任务的优化方案,借此了解任务最终是如何在集群中实现的。对于分析类任务,Flink提供了类似SQL的查询,图形化处理,以及机器学习库,此外还支持内存计算。

  Flink能很好地与其他组件配合使用。如果配合Hadoop 堆栈使用,该技术可以很好地融入整个环境,在任何时候都只占用必要的资源。该技术可轻松地与YARN、HDFS和Kafka 集成。在兼容包的帮助下,Flink还可以运行为其他处理框架,例如Hadoop和Storm编写的任务。

  目前Flink最大的局限之一在于这依然是一个非常“年幼”的项目。现实环境中该项目的大规模部署尚不如其他处理框架那么常见,对于Flink在缩放能力方面的局限目前也没有较为深入的研究。随着快速开发周期的推进和兼容包等功能的完善,当越来越多的组织开始尝试时,可能会出现越来越多的Flink部署。

4.总结

  Flink提供了低延迟流处理,同时可支持传统的批处理任务。Flink也许最适合有极高流处理需求,并有少量批处理任务的组织。该技术可兼容原生Storm和Hadoop程序,可在YARN管理的集群上运行,因此可以很方便地进行评估。快速进展的开发工作使其值得被大家关注。

工作中开发的例子(待我处理处理再公开):



参考:

1.https://www.jianshu.com/p/8301d49595f7

2.https://www.jianshu.com/p/2ee7134d7373【很多漂亮的图,可以借鉴】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值