本文轉(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ù)都到了再處理,也就是常說的批處理。
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 是一個(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之類的操作胁艰,更加簡潔。另外智蝠,用戶可以在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ù)流的算子殴泰,以一個(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)离咐。(有沒有一種熟悉的感覺谱俭,比如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)行說明。
1.4.3.2 Window
不同于批計(jì)算锅睛,流計(jì)算的計(jì)算一般是針對(duì)一個(gè)窗口的數(shù)據(jù)的計(jì)算埠巨,比如“統(tǒng)計(jì)過去5分鐘的記錄數(shù)”、“過去100個(gè)數(shù)據(jù)的平均值”等现拒。
窗口包括按時(shí)間進(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例驹,比如要計(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 語義裁良,保障正確性凿将。
支持Yarn / Mesos / K8S等多種資源管理器,可以方便擴(kuò)展价脾。
是一個(gè)批流統(tǒng)一的平臺(tái)牧抵,在未來,批流融合是一大趨勢侨把。
Flink SQL 降低了使用門檻灭忠,便于推廣。
下篇文章座硕,開始編寫第一個(gè)Flink 程序弛作。
掃描下方二維碼關(guān)注我。