本文轉(zhuǎn)自個人微信公眾號,原文鏈接。
Apache Flink is a framework and distributed processing engine for stateful computations over?unbounded and bounded?data streams. Flink has been designed to run in?all common cluster environments, perform computations at?in-memory speed?and at?any scale.
1 概念
1.1 Bounded Streams VS Unbounded Streams & 批處理 VS 流處理
Bounded Streams 可以理解為有開始也有結(jié)束的數(shù)據(jù)流,處理這類數(shù)據(jù)流可以等所有數(shù)據(jù)都到了再處理,也就是常說的批處理。
Unbounded Streams 可以理解為有開始沒有結(jié)束的數(shù)據(jù)流,這類數(shù)據(jù)流持續(xù)產(chǎn)生數(shù)據(jù),所以,也要持續(xù)的進(jìn)行處理而不能等數(shù)據(jù)流結(jié)束再處理,也就是常說的流處理。
Apache Flink 既能處理Bounded Streams 也擅長處理Unbounded Streams,既能做批處理也能做流處理。
1.2 部署方式
Apache Flink 是一個分布式系統(tǒng),需要資源以運行其它應(yīng)用,Apache Flink 支持常見的資源管理器,包括Yarn、 Mesos、K8S,也可以以Stand-Alone Cluster的方式運行。
1.3. Runtime

Apache Flink Runtime 是一個典型的master-slave架構(gòu), 包括Jobmanagers 和 Taskmanagers 兩部分:
Jobmanagers (masters):協(xié)調(diào)分布式執(zhí)行,包括調(diào)度任務(wù)、協(xié)調(diào)checkpoints、從失敗恢復(fù)等。一般至少需要一個Jobmanager,在HA環(huán)境下,需要有多個Jobmanagers,其中有一個作為leader,其他的standby。
taskmanagers (workers):執(zhí)行具體的任務(wù),buffer和傳遞數(shù)據(jù)流。
另外,Clients 不是Apache Flink Runtime的一部分,但常用于準(zhǔn)備和提交Job到 Jobmanager。
1.4 編程模型
1.4.1 抽象

Apache Flink 提供了不同的抽象級別以開發(fā)Flink 應(yīng)用。
Stateful Streaming:抽象級別最低,給應(yīng)用開發(fā)者提供了最大的自由度,實際開發(fā)中很少使用。
DataStream / DataSet API: 這是Flink 提供的核心APIs,DataStream API 用于Unbounded Stream Data,DataSet API 用于Boundesd Stream Data,用于使用各種方法對數(shù)據(jù)進(jìn)行計算處理,如map等。
Table API:以表為核心的的聲明式DSL,該表可以是動態(tài)變化的表,該層API提供了諸如Select、Join、Group-by、Aggregate之類的操作,更加簡潔。另外,用戶可以在Table API和Dataset/Datastream API 之間無縫切換甚至混用。
SQL:跟Table API相似,只不過是以SQL的方式進(jìn)行描述。
1.4.2 程序與Dataflows

Apache Flink 程序一般包括data streams和?transformations?兩部分,其中,data streams 是數(shù)據(jù)流,transformations 是操作數(shù)據(jù)流的算子,以一個或多個數(shù)據(jù)流為輸入,輸出一個或多個數(shù)據(jù)流。
當(dāng)Apache Flink 程序運行時,F(xiàn)link 程序可以理解為包含streams?和 transformation?operators?的streaming dataflow,每個dataflow 以一個或多個sources開始并以一個或多個sinks 結(jié)束,這個dataflow 類似于DAGs(directed acyclic graphs)。(有沒有一種熟悉的感覺,比如Spark、Flume…)
Sources:數(shù)據(jù)源,常見的如kafka。
Transformations:數(shù)據(jù)轉(zhuǎn)換,可以理解為對數(shù)據(jù)的操作。
Sinks:接收器,F(xiàn)link 轉(zhuǎn)換后將數(shù)據(jù)發(fā)送到的地方。
1.4.3 其它重要概念
1.4.3.1 Time
在流計算中,Time包括三種:
Ingestion Time:數(shù)據(jù)記錄進(jìn)入Flink Data Source的時間。
Processing Time:Flink Operator進(jìn)行time-based 操作的本地時間。
Event Time:數(shù)據(jù)的時間,一般有業(yè)務(wù)意義。
Apache 可以支持這三種Time,每種Time都有特定的用途,后序文章會詳細(xì)進(jìn)行說明。

1.4.3.2 Window
不同于批計算,流計算的計算一般是針對一個窗口的數(shù)據(jù)的計算,比如“統(tǒng)計過去5分鐘的記錄數(shù)”、“過去100個數(shù)據(jù)的平均值”等。
窗口包括按時間進(jìn)行劃分的和按數(shù)據(jù)進(jìn)行劃分的,典型的包括?tumbling windows、?sliding windows,?session windows,每種窗口應(yīng)用于不同的場景。
1.4.3.3 State
有些操作只需要知道當(dāng)前數(shù)據(jù)記錄即可,還有些操作需要其它數(shù)據(jù)記錄,我們稱這種操作是stateful operations,比如要計算Sum、Avg等,這些值是需要存儲的,因為會不斷變化,這些值就可以理解為?state。
Apache Flink 提供了內(nèi)置的狀態(tài)管理,這也是Flink 區(qū)別于其它流計算引擎的最主要的區(qū)別。
1.4.3.4 Checkpoint
Apache Flink的checkpoints 可以理解為輸入數(shù)據(jù)流在某一點以及所有operators對應(yīng)的state,Apache Flink 基于checkpoints 和 stream replay 實現(xiàn)容錯,并基于此實現(xiàn)數(shù)據(jù)一致性(exactly-once)。
2 Why Flink
上面主要介紹Flink 中的核心概念,總結(jié)下為什么選擇Flink:
Apache Flink 是一個低延遲、高吞吐、統(tǒng)一的大數(shù)據(jù)計算引擎。
支持狀態(tài)管理,提供有狀態(tài)的計算。
提供準(zhǔn)確的結(jié)果,即使出現(xiàn)數(shù)據(jù)亂序或數(shù)據(jù)延遲。Flink 程序符合自然規(guī)律,如多種窗口、event time等能滿足正確性的要求,而且,基于checkpoint 和replay 提供故障恢復(fù),支持 Exactly-Once 語義,保障正確性。
支持Yarn / Mesos / K8S等多種資源管理器,可以方便擴(kuò)展。
是一個批流統(tǒng)一的平臺,在未來,批流融合是一大趨勢。
Flink SQL 降低了使用門檻,便于推廣。
下篇文章,開始編寫第一個Flink 程序。
掃描下方二維碼關(guān)注我。
