本文轉(zhuǎn)自個(gè)人微信公眾號(hào),原文鏈接。
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ù)都到了再處理,也就是常說(shuō)的批處理。
Unbounded Streams 可以理解為有開始沒(méi)有結(jié)束的數(shù)據(jù)流,這類數(shù)據(jù)流持續(xù)產(chǎn)生數(shù)據(jù),所以,也要持續(xù)的進(jìn)行處理而不能等數(shù)據(jù)流結(jié)束再處理,也就是常說(shuō)的流處理。
Apache Flink 既能處理Bounded Streams 也擅長(zhǎng)處理Unbounded Streams,既能做批處理也能做流處理。
1.2 部署方式
Apache Flink 是一個(gè)分布式系統(tǒng),需要資源以運(yùn)行其它應(yīng)用,Apache Flink 支持常見的資源管理器,包括Yarn、 Mesos、K8S,也可以以Stand-Alone Cluster的方式運(yùn)行。
1.3. Runtime

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

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

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

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