Flink數(shù)據(jù)流編程模型(隨意翻譯--不準(zhǔn)確)

原文:https://ci.apache.org/projects/flink/flink-docs-release-1.3/concepts/programming-model.html

抽象層次

Flink為開發(fā)流式應(yīng)用和批處理應(yīng)用提供了不同層次的抽象


最底層的抽象僅僅提供有狀態(tài)的流,它通過過程函數(shù)(Process Function)被嵌入到DataStream API中。它允許用戶自由地處理來自一個(gè)或者多個(gè)流中的事務(wù),并且使用一致性容錯(cuò)狀態(tài)。此外,用戶還可以注冊事務(wù)時(shí)間和處理時(shí)間的回調(diào)來程序識別復(fù)雜的計(jì)算。

實(shí)際上,大部分的應(yīng)用程序不會用到上述描述中的底層抽象,反而會用到Core API如DataStream API(有界、無界流數(shù)據(jù))和DataSet(有界數(shù)據(jù)集)。這些流利的API提供了數(shù)據(jù)處理的通用模塊,如各種形式的轉(zhuǎn)換、連接、聚合、窗口、狀態(tài)等。這些API處理的數(shù)據(jù)類型表現(xiàn)為相應(yīng)的編程語言中的類。

底層的過程函數(shù)(Process Function)與DataStream API結(jié)合,可以去底層抽象中執(zhí)行某些特定的操作。DataSet API也為有界的數(shù)據(jù)集提供了額外的原語,如:loops/ietrations

Table API是一個(gè)圍繞表并且可能會動態(tài)改變表(表示流的時(shí)候)的聲明式DSL。Table API遵循如下關(guān)系模型:表有一個(gè)附加的模式(類似關(guān)系型數(shù)據(jù)庫中的表)并且這些API提供有可比性的操作,例如select、project、join、group-by、aggregate等。Table API程序指定了哪些邏輯操作必須做,而不是指定操作代碼的形式。雖然Table API可以通過各種用戶自定義函數(shù)來擴(kuò)展,但是相對于CoreAPI來說,還是缺乏表現(xiàn)力,但是對于用戶來說,更加簡潔了。此外,Table API會在執(zhí)行之前通過優(yōu)化器來做一些優(yōu)化操作。

由Flink提供的最高層的抽象就是SQL。這個(gè)抽象在語義和表現(xiàn)上與Table API類似,但是在語法上與SQL的查詢語法類似。SQL抽象可以與Table API進(jìn)行交互,并且SQL查詢可以在Table API定義的表上執(zhí)行。

程序與數(shù)據(jù)流

Flink程序最基本的編程模塊是streams和transformations,(注意:Flink DataSet API中用到的DataSet本質(zhì)上也是流,后續(xù)會講到)。從概念上來講stream就是一個(gè)(可能是無盡的)數(shù)據(jù)記錄流,而transformation就是將一個(gè)或者多個(gè)stream作為輸入,并產(chǎn)生一個(gè)或者多個(gè)stream作為結(jié)果的操作。

當(dāng)執(zhí)行的時(shí)候,F(xiàn)link程序就會映射成streaming dataflows(流式數(shù)據(jù)流),這些streaming dataflows(流式數(shù)據(jù)流)由stream和transformation操作組成。每個(gè)dataflow(數(shù)據(jù)流)以一個(gè)或者多個(gè)Source(源)開始,并以一個(gè)或者多個(gè)Sink(槽)為結(jié)束。Dataflow類似于有向無環(huán)圖(DAG),


通常程序中的transformation(轉(zhuǎn)換)和dataflow(數(shù)據(jù)流)中的操作都是一一對應(yīng)的,當(dāng)然,有的時(shí)候有可能一個(gè)轉(zhuǎn)換有多個(gè)轉(zhuǎn)換操作。

Sources和Sinks的文檔在streaming connectors和batch connectors的文檔中,Transformation的文檔在DataStream transformation和DataSet

transformation中。

并行數(shù)據(jù)流

Flink中的程序本質(zhì)上都是并行的分布式的。在運(yùn)行期間,每個(gè)stream都有一個(gè)或者多個(gè)stream的分區(qū),每個(gè)操作都有一個(gè)或者多個(gè)子任務(wù)。每個(gè)子任務(wù)跟其他的子任務(wù)都是獨(dú)立的,運(yùn)行在不同的線程上,并且有可能運(yùn)行在不同的機(jī)器或者容器中。


Streams可以在兩個(gè)transport之間以一對一或者重分區(qū)的模式進(jìn)行傳輸:

一對一:(如上述的Source和map之間的操作)streams保持原有的分區(qū)和元素的順序不變。也就是說map操作的子任務(wù)看到的元素的順序與Source操作產(chǎn)生的元素的順序是一致的。

重分區(qū):重分區(qū)stream(比如map和keyBy/window之間以及keyBy/window和sink之間)改變了原來stream的分區(qū)信息。每一個(gè)子任務(wù)根據(jù)選擇的信息將數(shù)據(jù)分發(fā)到不同的目標(biāo)子任務(wù)中去。

更多關(guān)于控制并發(fā)的配置請參考:https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/parallel.html

Windows

聚合類事件(如:counts、sums)在流上的處理與批處理有所不同。例如:在流上對所有的元素進(jìn)行計(jì)數(shù)是不可能的,因?yàn)榱魃系臄?shù)據(jù)是源源不斷的產(chǎn)生著。因此,流上的聚合(例如:counts、sums)以窗口作為范圍,例如計(jì)算最近5分鐘的數(shù)據(jù)量,計(jì)算最近100個(gè)元素的總和。

Windows(窗口)可以是時(shí)間驅(qū)動的(例如:每30分鐘)或者是數(shù)據(jù)驅(qū)動的(例如:每100個(gè)元素)。不同類別的窗口的典型差異:例如:tumbling

windows(翻滾窗口)(沒有重疊)、sliding windows(滑動窗口)(有重疊)以及session windows(會話窗口)(間斷的空白)。


更多Windows的例子可以從這里獲取https://flink.apache.org/news/2015/12/04/Introducing-windows.html,更多Windows的細(xì)節(jié)可以參考這里https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/windows.html

Time

當(dāng)我們提到流程序中的Time(時(shí)間)時(shí),我們先來提一下不同的時(shí)間概念:

Event Time(事件時(shí)間)是指事件創(chuàng)建時(shí)的時(shí)間。在事件中往往以時(shí)間戳作為描述,例如傳感器的連接時(shí)間、服務(wù)的產(chǎn)生時(shí)間。Flink通過timestamp assigners來獲取事件時(shí)間。

Ingestion Time(攝入時(shí)間)是指事件進(jìn)入Flink數(shù)據(jù)流源操作時(shí)的時(shí)間。

Processing Time(處理時(shí)間)是指執(zhí)行每個(gè)時(shí)間操作時(shí)的本地時(shí)間。


關(guān)于如何處理時(shí)間的詳細(xì)信息請參考:https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/event_time.html

Stateful Operations

雖然許多數(shù)據(jù)流的操作都只是一次查看一個(gè)單獨(dú)的數(shù)據(jù)流(例如一個(gè)事件解析器),一些操作則需要從多個(gè)事件中獲取信息(例如window操作)。這些操作被叫做stateful(狀態(tài)性操作)。

狀態(tài)性操作的狀態(tài)保存在一個(gè)嵌入式的key/value系統(tǒng)中,state(狀態(tài))的分區(qū)和分布與狀態(tài)性操作讀取的數(shù)據(jù)流的分區(qū)和分布是嚴(yán)格一致的。因此,只能是通過keyBy函數(shù)處理之后的有鍵值的流才能調(diào)用到key/value狀態(tài),并且僅限于與當(dāng)前的key有關(guān)聯(lián)的values。對齊流和狀態(tài)的鍵,確保所有的狀態(tài)更新都是本地操作,保證了一致性而沒有事務(wù)的開銷。這個(gè)對齊性也使得Flink能夠透明地對state進(jìn)行重分區(qū)和調(diào)整數(shù)據(jù)流的分區(qū)。


更多信息參考文檔:https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/stream/state.html

Checkpoints for Fault Tolerance

Flink通過stream的重試機(jī)制和checkpoint機(jī)制來實(shí)現(xiàn)容錯(cuò)的。Checkpoint與每一個(gè)輸入流中的特定點(diǎn)及每個(gè)運(yùn)算符中的對應(yīng)狀態(tài)相關(guān)。一個(gè)數(shù)據(jù)流可以在保持一致性的同時(shí)通過恢復(fù)檢查點(diǎn)操作的狀態(tài)和重試檢查點(diǎn)的事件來從檢查點(diǎn)鐘恢復(fù)。

Batch on Streaming

Flink執(zhí)行批處理程序是以一種特殊的流程序來實(shí)現(xiàn)的,在這種程序中流是有限的(元素個(gè)數(shù)是有限的)。DateSet在內(nèi)部被當(dāng)做流來處理。上述的概念既適用于批處理也適用于流式處理,除了一些細(xì)微的差別:

1、批處理的容錯(cuò)機(jī)制不使用checkpoint機(jī)制,當(dāng)streams重試時(shí),只能所有的一切重來。這主要是因?yàn)閿?shù)據(jù)是有限的。這種機(jī)制提高了恢復(fù)的成本,但是降低了實(shí)現(xiàn)的復(fù)雜度,因?yàn)楸苊饬薱heckpoint機(jī)制。

2、DataSet中的狀態(tài)性操作使用的是內(nèi)存數(shù)據(jù)結(jié)構(gòu)或者out-of-core數(shù)據(jù)結(jié)構(gòu),而不是key/value系統(tǒng)

3、DataSet API引進(jìn)了一種特殊的synchronized迭代,這種迭代只能在有限的數(shù)據(jù)流中使用。更多詳情,請查看iteration的文檔https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/batch/iterations.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內(nèi)容

  • 簡單之美 | Apache Flink:特性、概念、組件棧、架構(gòu)及原理分析http://shiyanjun.cn/...
    葡萄喃喃囈語閱讀 7,453評論 0 27
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,836評論 18 139
  • 介紹 概述 Apache Flink是一個(gè)面向數(shù)據(jù)流處理和批量數(shù)據(jù)處理的可分布式的開源計(jì)算框架,它基于同一個(gè)Fli...
    stephen_k閱讀 51,209評論 0 22
  • 這個(gè)秋天若還剩百分之一的零頭 不知抵去的是誰的生命
    棖觸良深閱讀 242評論 0 0
  • 明鏡覺得自己已經(jīng)很幸運(yùn)了,雖然這輩子什么看不見,至少還可以聽到自己的聲音,安杰的聲音,爸爸媽媽的聲音,這個(gè)世界上悅...
    蕓舟閱讀 455評論 5 5