流式计算领域的新霸主: Apache Flink

2020-07-03 00:00:00 数据 支持 是一个 的是 语义

这篇文章来介绍一下实时计算领域的新霸主 Apache Flink。Flink 早于 2008 年诞生于柏林理工大学,然后在 2014 年进入 Apache 基金会孵化器,毕业之后迅速走红。在 2015 年,关于 Flink 的论文问世,也就是 Apache Flink: Stream and Batch Processing in a Single Engine。从论文的题目也可以看出 Flink 的定义一个批流一体的计算引擎,这个理念也很契合 Google Dataflow 的理念。当然 Flink 的设计很多借鉴了 Google Dataflow 模型的思想,比如一些语义。这篇文章简单介绍一下 Flink,错误之处还请指正。

0. Overview

在之前的一篇文章 现代流式计算的基石:Google DataFlow 中说过 Flink 的两个主要优势在于:1. 实现了 Google Dataflow/Beam 的编程模型,2. 使用分布式异步快照算法 Chandy-Lamport 的变体。而这其中的 Dataflow/Beam 语义模型目前应该是 Flink 支持的好的。虽然 Spark Structured Streaming 也开始实现借鉴 Dataflow/Beam 语义模型,但是在 continuous mode 上面支持还是偏弱。还有一点比较主要的是,Spark 的核心还是在于 Spark SQL 和 AI 方面,实时计算这块的发展的优先级要弱很多。

1. Google Dataflow/Beam

参考我之前的一篇文章: 现代流式计算的基石:Google DataFlow 。

Flink 中的 event time/processing time,window,watermark 等思想都是继承自 DataFlow,这里就不再赘述了。

2. Flink 编程模型

在这个 Declarative API 流行的时代,Flink 的编程模型也提供了不同抽象程度的 API,按抽象程度高低划分如下:SQL > Table API > DataStream/DataSet API > Stateful Stream Process。其中 SQL 和 Table API 都可以称为 Declarative API。

2.1 SQL

下面是一个 SQL API 的示例。

val env = StreamExecutionEnvironment.getExecutionEnvironment
val tableEnv = TableEnvironment.getTableEnvironment(env)

// read a DataStream from an external source
val ds: DataStream[(Long, String, Integer)] = env.addSource(...)

// SQL query with an inlined (unregistered) table
val table = ds.toTable(tableEnv, 'user, 'product, 'amount)
val result = tableEnv.sqlQuery(
  s"SELECT SUM(amount) FROM $table WHERE product LIKE '%Rubber%'")

相关文章