Apache Flink

Apache Flink是由Apache軟體基金會開發的開源流處理框架，其核心是用Java和Scala編寫的分布式流數據流引擎。Flink以數據並行和管道方式執行任意流數據程序，Flink的流水線運行時系統可以執行批處理和流處理程序。此外，Flink的運行時本身也支持迭代演算法的執行。

Flink提供高吞吐量、低延遲的流數據引擎以及對事件-時間處理和狀態管理的支持。Flink應用程式在發生機器故障時具有容錯能力，並且支持exactly-once語義。程序可以用Java、Scala、Python和SQL等語言編寫，並自動編譯和優化到在集群或雲環境中運行的數據流程序。

Flink並不提供自己的數據存儲系統，但為Amazon Kinesis、Apache Kafka、Alluxio、HDFS、Apache Cassandra和Elasticsearch等系統提供了數據源和接收器。

## 開發

Apache Flink是由Apache軟體基金會內的Apache Flink社區基於Apache許可證2.0開發的，該項目已有超過100位代碼提交者和超過 460貢獻者。

data Artisans是由Apache Flink的創始人創建的公司。目前，該公司已聘用了12個Apache Flink的代碼提交者。

## 概述

Apache Flink的數據流編程模型在有限和無限數據集上提供單次事件（event-at-a-time）處理。在基礎層面，Flink程序由流和轉換組成。「從概念上講，流是一種（可能永無止境的）數據流記錄，轉換是一種將一個或多個流作為輸入並因此產生一個或多個輸出流的操作」。

Apache Flink包括兩個核心API：用於有界或無界數據流的數據流API和用於有界數據集的數據集API。Flink還提供了一個表API，它是一種類似SQL的表達式語言，用於關係流和批處理，可以很容易地嵌入到Flink的數據流和數據集API中。Flink支持的最高級語言是SQL，它在語義上類似於表API，並將程序表示為SQL查詢表達式。

### 編程模型和分布式運行時

Flink程序在執行後被映射到流數據流，每個Flink數據流以一個或多個源（數據輸入，例如消息隊列或文件系統）開始，並以一個或多個接收器（數據輸出，如消息隊列、文件系統或資料庫等）結束。Flink可以對流執行任意數量的變換，這些流可以被編排為有向無環數據流圖，允許應用程式分支和合併數據流。

Flink提供現成的源和接收連接器，包括Apache Kafka、Amazon Kinesis、HDFS和Apache Cassandra等。

Flink程序可以作為集群內的分布式系統運行，也可以以獨立模式或在YARN、Mesos、基於Docker的環境和其他資源管理框架下進行部署。

### 狀態：檢查點、保存點和容錯

Apache Flink具有一種基於分布式檢查點的輕量級容錯機制。檢查點是應用程式狀態和源流中位置的自動異步快照。在發生故障的情況下，啟用了檢查點的Flink程序將在恢復時從上一個完成的檢查點恢復處理，確保Flink在應用程式中保持一次性（exactly-once）狀態語義。檢查點機制暴露應用程式代碼的接口，以便將外部系統包括在檢查點機制中（如打開和提交資料庫系統的事務）。

Flink還包括一種名為保存點的機制，它是一種手動觸發的檢查點。使用者可以生成保存點，停止正在運行的Flink程序，然後從流中的相同應用程式狀態和位置恢復程序。保存點可以在不丟失應用程式狀態的情況下對Flink程序或Flink群集進行更新。從Flink 1.2開始，保存點還允許以不同的並行性重新啟動應用程式，這使得使用者可以適應不斷變化的工作負載。

### 數據流API

Flink的 數據流API支持有界或無界數據流上的轉換（如過濾器、聚合和窗口函數），包含了20多種不同類型的轉換，可以在Java和Scala中使用。

有狀態流處理程序的一個簡單Scala示例是從連續輸入流發出字數並在5秒窗口中對數據進行分組的應用：

```scala
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time

case class WordCount(word: String, count: Int)

object WindowWordCount {
  def main(args: Array[String]) {

    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val text = env.socketTextStream("localhost", 9999)

    val counts = text.flatMap { _.toLowerCase.split("\\W+") filter { _.nonEmpty } }
      .map { WordCount(_, 1) }
      .keyBy("word")
      .timeWindow(Time.seconds(5))
      .sum("count")

    counts.print

    env.execute("Window Stream WordCount")
  }
}
```

#### Apache Beam - Flink Runner

Apache Beam「提供了一種高級統一編程模型，允許（開發人員）實現可在在任何執行引擎上運行批處理和流數據處理作業」。Apache Flink-on-Beam運行器是功能最豐富的、由Beam社區維護的能力矩陣。

data Artisans與Apache Flink社區一起，與Beam社區密切合作，開發了一個強大的Flink runner。

### 數據集API

Flink的 數據集API支持對有界數據集進行轉換（如過濾、映射、連接和分組），包含了20多種不同類型的轉換。該API可用於Java、Scala和實驗性的Python API。Flink的數據集API在概念上與數據流API類似。

### 表API和SQL

Flink的 表API是一種類似SQL的表達式語言，用於關係流和批處理，可以嵌入Flink的Java和Scala數據集和數據流API中。表API和SQL接口在關係表抽象上運行，可以從外部數據源或現有數據流和數據集創建表。表API支持關係運算符，如表上的選擇、聚合和連接等。

也可以使用常規SQL查詢表。表API提供了和SQL相同的功能，可以在同一程序中混合使用。將錶轉換回數據集或數據流時，由關係運算符和SQL查詢定義的邏輯計劃將使用Apache Calcite進行優化，並轉換為數據集或數據流程序。

## Flink Forward

Flink Forward是一個關於Apache Flink的年度會議。第一屆Flink Forward於2015年在柏林舉行。為期兩天的會議有來自16個國家的250多名與會者。會議分為兩個部分，Flink開發人員提供30多個技術演示，另外還有一個Flink培訓實踐。

2016年，350名與會者參加了會議，40多位發言人在3個平行軌道上進行了技術講座。第三天，與會者被邀請參加實踐培訓課程。

2017年，該活動也將擴展到舊金山。會議致力於Flink如何在企業中使用、Flink系統內部、與Flink的生態系統集成以及平台的未來進行技術會談。它包含主題演講Flink使用者在工業和學術界的講座以及關於Apache Flink的實踐培訓課程。

來自以下組織的發言人在Flink Forward會議上發表了演講：阿里巴巴集團、Amadeus、Bouygues Telecom、第一資本、Cloudera、data Artisans、EMC、愛立信、Hortonworks、華為、IBM、Google、MapR、MongoDB、Netflix、New Relic、Otto Group，Red Hat、ResearchGate、Uber和Zalando。

## 歷史

2010年，研究項目「Stratosphere：雲上的資訊管理」（由德國研究基金會（DFG）資助）由柏林工業大學、柏林洪堡大學和哈索·普拉特納研究院合作啟動。Flink從Stratosphere的分布式執行引擎的一個分支開始，於2014年3月成為Apache孵化器項目。2014年12月，Flink成為Apache頂級項目。

版本｜原始發布的日期｜最新版本｜發布日期

o｜2015-06-24｜0.9.1｜2015-09-01

o｜2015-11-16｜0.10.2｜2016-02-11

o｜2016-03-08｜1.0.3版｜2016-05-11

o｜2016-08-08｜1.1.5｜2017-03-22

o｜2017-02-06｜1.2.1｜2017-04-26

o｜2017-06-01｜1.3.3｜2018-03-15

o｜2017-12-12｜1.4.2｜2018-03-08

o｜2018-05-25｜1.5.5｜2018-10-29

2018-08-08｜1.6.2｜2018-10-29

c｜2018-11-30｜1.7.2｜2019-02-15

l

發布日期

- 08/2018: Apache Flink1.6 (09/2018: 1.6.1;10/2018: 1.6.2)
- 05/2018: Apache Flink1.5 (07/2018: 1.5.1;07/2018: 1.5.2;08/2018: 1.5.3;09/2018: 1.5.4;10/2018: 1.5.5)
- 12/2017年: Apache Flink1.4 (02/2018: 1.4.1;03/2018: 1.4.2)
- 06/2017: Apache Flink1.3 (06/2017: 1.3.1;08/2017: 1.3.2;03/2018: 1.3.3)
- 02/2017: Apache Flink1.2 (04/2017: 1.2.1)
- 08/2016: Apache Flink1.1 (08/2016: 1.1.1;09/2016 v1。1.2;10/2016 v1。1.3;12/2016 v1。1.4;03/2017 v1。1.5)
- 03/2016: Apache Flink1.0 (04/2016: 1.0.1;04/2016: 1.0.2;05/2016 v1。0.3)
- 11/2015: Apache Flink0.10 (11/2015: 0.10.1;02/2016: 0.10.2)
- 06/2015: Apache Flink0.9 (09/2015: 0.9.1)
- 04/2015: Apache Flink0.9-里程碑-1

Apache孵化器發布日期

- 01/2015: Apache Flink0.8-孵化
- 11/2014: Apache Flink0.7-孵化
- 08/2014: Apache Flink0.6-孵化 (09/2014: 0.6.1-孵化)
- 05/2014: Stratosphere 0.5(06/2014:0.5.1;07/2014:0.5.2)

Pre-Apache Stratosphere 發布日期

- 01/2014: Stratosphere 0.4（0.3版本被跳過）
- 08/2012: Stratosphere 0.2
- 05/2011: Stratosphere 0.1（08/2011:0.1.1）

## 參見

- Apache軟體基金會項目列表
- 其他類似的數據處理引擎，如Storm和Spark。
- Apache Beam，一種共享編程模型，Flink是其創始後端。

## 基本資料

- 開發者：Apache軟體基金會
- 發行日期：2011年
- 程式語言：Java和Scala
- 作業系統：跨平台
- 類型：數據分析、機器學習演算法
- 許可協議：Apache許可證 2.0