Apache Flink是目前业界公认最好的流计算引擎之一,其计算能力不仅仅局限于做流处理,而是一套兼具流、批、机器学习等多种计算功能的大数据引擎,用户只需根据业务逻辑开发一套代码,无论是全量数据还是增量数据,亦或者实时处理,一套方案即可全部支持。

Apache Flink 的定义、架构及原理

Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速计算。

  • Streams: 分为有限数据流与无限数据流,无限数据流的数据会随时间的推演而持续增加,计算持续进行且不存在结束的状态,相对的有限数据流数据大小固定,计算最终会完成并处于结束的状态。
  • State: 状态是计算过程中的数据信息,在容错恢复和 Checkpoint 中有重要的作用,流计算在本质上是 Incremental Processing,因此需要不断查询并更新状态;另外,为了确保 Exactly- once 语义,需要数据能够写入到状态中;而持久化存储,能够保证在整个分布式系统运行失败或者挂掉的情况下做到 Exactly- once,这是状态的另外一个价值。
  • Time: 分为 Event time、Ingestion time、Processing time。时间是我们判断业务状态是否滞后,数据处理是否及时的重要依据。
  • API: 由上而下可分为 SQL / Table API、DataStream API、ProcessFunction 三层

有状态的流式处理

传统批处理方法持续收取数据,以时间作为划分多个批次的依据,再周期性地执行批次运算。假设需要计算每小时出现事件转换的次数,如果事件转换跨越了所定义的时间划分,传统批处理会将中介运算结果带到下一个批次进行计算;除此之外,当出现接收到的事件顺序颠倒情况下,传统批处理仍会将中介状态带到下一批次的运算结果中,这种处理方式也不尽如人意。

batch

引擎必须要有能力可以累积状态和维护状态,累积状态代表着过去历史中接收过的所有事件,会影响到输出。

时间意味着引擎对于数据完整性有机制可以操控,当所有数据都完全接受到后,输出计算结果。

理想方法模型需要实时产生结果,但更重要的是采用新的持续性数据处理模型来处理实时数据,这样才最符合 continuous data 的特性。

batch


DataStream API

Apache Flink 提供了 DataStream API 来实现有状态的流处理应用程序。Flink 支持对状态和时间的细粒度控制,以此来实现复杂的事件驱动数据处理系统。

Flink Maven Archetype:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-walkthrough-datastream-java \
-DarchetypeVersion=1.10.0 \
-DgroupId=frauddetection \
-DartifactId=frauddetection \
-Dversion=0.1 \
-Dpackage=spendreport \
-DinteractiveMode=false

mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-walkthrough-datastream-scala \
-DarchetypeVersion=1.10.0 \
-DgroupId=frauddetection \
-DartifactId=frauddetection \
-Dversion=0.1 \
-Dpackage=spendreport \
-DinteractiveMode=false

Reference:

  1. Apache Flink v1.10 官方中文文档
  2. Apache Flink零基础入门到进阶
  3. Apache Flink 是什么?