原文鏈接
博主理解篇
Flink提供不同級(jí)別的抽象來(lái)開(kāi)發(fā)流/批處理應(yīng)用程序。
低階的處理函數(shù)集成了DataStream API,這樣就可以針對(duì)特性的操作使用低層級(jí)的抽象。DataSet API 為有邊界的 data sets提供了附加的原語(yǔ),例如循環(huán)/迭代。
Flink程序的基本構(gòu)建模塊是streams(流)和transformations(轉(zhuǎn)換)。(需要注意的是,F(xiàn)link的DataSet API所使用的DataSets內(nèi)部也是流-更多內(nèi)容將在以后解釋)。從概念上講流(可能沒(méi)有結(jié)束)是一個(gè)數(shù)據(jù)流記錄,而轉(zhuǎn)換是一個(gè)操作,它取一種或者多個(gè)流作為輸入,并產(chǎn)生一個(gè)或者多個(gè)輸出流作為結(jié)果。
當(dāng)執(zhí)行的時(shí)候,F(xiàn)link程序映射到streaming dataflows(流數(shù)據(jù)流),由streams和轉(zhuǎn)換operators組成。每一個(gè)數(shù)據(jù)流開(kāi)始于一個(gè)或者多個(gè)source,并且終止于一個(gè)或者多個(gè)sink。數(shù)據(jù)流類似于任意的有向無(wú)環(huán)圖(DAGS)。雖然通過(guò)迭代構(gòu)造允許特定形式的環(huán),但是大多數(shù)情況下,簡(jiǎn)單起見(jiàn),我們都不考慮這一點(diǎn)。
通常情況下,程序中的轉(zhuǎn)換與數(shù)據(jù)流中的操作是一一對(duì)應(yīng)的。有時(shí),然而,一個(gè)轉(zhuǎn)換可能有多個(gè)轉(zhuǎn)換操作構(gòu)成。
source和sink的文檔在streaming connectors和 batch connectors 。Transformation的文檔在DataStream operators和DataSet transformation。
Flink程序本質(zhì)上是并行的和分布式的。在執(zhí)行過(guò)程中,一個(gè)流(stream)包含一個(gè)或多個(gè)流分區(qū) (stream partition),而每一個(gè)operator包含一個(gè)或多個(gè)operator子任務(wù) 。操作子任務(wù)之間彼此獨(dú)立,在不同的線程中執(zhí)行,甚至有可能運(yùn)行在不同的機(jī)器或容器上。
operator子任務(wù)的數(shù)量即是此特定operator的并行度 。一個(gè)流的并行度即其生產(chǎn)operator的并行度。相同程序中的不同的operator可能有不同級(jí)別的并行度。
流在兩個(gè)operator之間傳輸數(shù)據(jù),可以通過(guò)一對(duì)一(或稱 forwarding )模式,或者通過(guò)redistributing模式:
聚合事件(比如計(jì)數(shù)、求和)在流上的工作方式與批處理不同。比如,對(duì)流中的所有元素進(jìn)行計(jì)數(shù)是不可能的,因?yàn)橥ǔA魇菬o(wú)限的(無(wú)邊界的)。相反,流上的聚合需要由窗口來(lái)劃定范圍,比如 “計(jì)算過(guò)去的5分鐘” ,或者 “最后100個(gè)元素的和” 。
窗口可以是事件驅(qū)動(dòng)的 (比如:每30秒)或者數(shù)據(jù)驅(qū)動(dòng)的 (比如:每100個(gè)元素)。窗口通常被區(qū)分為不同的類型,比如滾動(dòng)窗口 (沒(méi)有重疊), 滑動(dòng)窗口(有重疊),以及會(huì)話窗口(由不活動(dòng)的間隙所打斷)
更多的窗口例子可以查看這個(gè)博客。更多的明細(xì)可以查看窗口文檔window docs。
當(dāng)提到流程序(例如定義窗口)中的時(shí)間時(shí),你可以參考不同的時(shí)間概念:
盡管數(shù)據(jù)流中的很多操作一次只查看一個(gè)獨(dú)立的事件(比如事件解析器),有些操作卻會(huì)記錄多個(gè)事件間的信息(比如窗口算子)。 這些操作被稱為有狀態(tài)的 。
有狀態(tài)操作的狀態(tài)保存在一個(gè)可被視作嵌入式鍵/值存儲(chǔ)的部分中。狀態(tài)由有狀態(tài)operator讀取的流一起被嚴(yán)格地分區(qū)與分布。因此,只能訪問(wèn)一個(gè) keyBy() 函數(shù)之后的 keyed streams 的鍵/值狀態(tài),并且僅限于與當(dāng)前事件鍵相關(guān)聯(lián)的值。調(diào)整流和狀態(tài)的鍵確保了所有狀態(tài)更新都是本地操作,以在沒(méi)有事務(wù)開(kāi)銷的情況下確保一致性。這種對(duì)齊還使得Flink可以透明地重新分配狀態(tài)與調(diào)整流的分區(qū)。
查看更多信息,請(qǐng)查看此文檔有關(guān)state的內(nèi)容。
Flink使用流重放與檢查點(diǎn)的結(jié)合實(shí)現(xiàn)了容錯(cuò)。檢查點(diǎn)與每個(gè)輸入流的特定點(diǎn)及與相關(guān)的每一個(gè)operator的狀態(tài)相關(guān)。一個(gè)數(shù)據(jù)流可以從一個(gè)檢查點(diǎn)恢復(fù)出來(lái),其中通過(guò)恢復(fù)operator狀態(tài)并從檢查點(diǎn)重放事件以保持一致性 (一次處理語(yǔ)義)
檢查點(diǎn)間隔是以恢復(fù)時(shí)間(需要重放的事件數(shù)量)來(lái)消除執(zhí)行過(guò)程中容錯(cuò)的開(kāi)銷的一種手段。
容錯(cuò)內(nèi)部的描述提供了更多關(guān)于flink管理檢查點(diǎn)和相關(guān)的話題。啟用和配置檢查點(diǎn)的詳細(xì)信息請(qǐng)查看這個(gè)文檔checkpointing API docs。
Flink將批處理程序作為流處理程序的特殊情況來(lái)執(zhí)行,只是流是有界的(有限個(gè)元素)。 DataSet 內(nèi)部被視為數(shù)據(jù)流。上述適用于流處理程序的概念同樣適用于批處理程序,除了一些例外:
原文鏈接
對(duì)于分布式運(yùn)行,F(xiàn)link將operator子任務(wù)鏈接在一起放入任務(wù)池。每個(gè)任務(wù)由一個(gè)線程執(zhí)行。將operator鏈接到任務(wù)池中是一項(xiàng)有用的優(yōu)化:它減少線程到線程的切換和緩沖的開(kāi)銷,并在降低延遲的同時(shí)提高整體吞吐量??梢耘渲面溄有袨?,有關(guān)詳細(xì)信息,請(qǐng)查閱鏈接文檔。
下圖中的示例數(shù)據(jù)流由五個(gè)子任務(wù)執(zhí)行,因此有五個(gè)并行線程。
Flink運(yùn)行時(shí)有兩種類型的進(jìn)程組成:
每個(gè)Worker節(jié)點(diǎn)(任務(wù)管理器)是一個(gè)JVM進(jìn)程,在分開(kāi)的線程中可以執(zhí)行一個(gè)或多個(gè)子任務(wù)。一個(gè)Worker通過(guò)控制task slots(至少一個(gè))來(lái)控制節(jié)點(diǎn)接受多少任務(wù)。
每個(gè)task slot代表任務(wù)管理器固定大小的資源子集。例如:一個(gè)擁有3個(gè)slot的任務(wù)管理器,將會(huì)分配它管理的1/3內(nèi)存到每個(gè)slot。對(duì)資源進(jìn)行分槽(slot)意味著子任務(wù)不會(huì)與其他作業(yè)的子任務(wù)競(jìng)爭(zhēng)管理的內(nèi)存,而是具有一定數(shù)量的保留管理內(nèi)存。注意此處沒(méi)有CPU隔離發(fā)生,現(xiàn)在只能分隔任務(wù)的管理內(nèi)存。
通過(guò)調(diào)整task slot數(shù)目,用戶可以定義子任務(wù)之間如何隔離。每個(gè)任務(wù)管理器擁有一個(gè)slot意味著任務(wù)組運(yùn)行在隔離的JVM(例如,可以在隔離的容器上啟動(dòng))上。擁有多個(gè)slots意味著更多的子任務(wù)共享相同的JVM。在相同的JVM上的任務(wù)共享TCP連接(通過(guò)多路復(fù)用)和心跳信息。它們還可以共享數(shù)據(jù)集和數(shù)據(jù)結(jié)構(gòu),從而減少每個(gè)任務(wù)的開(kāi)銷。
默認(rèn)情況下,F(xiàn)link允許子任務(wù)共享slot,即使它們是不同任務(wù)的子任務(wù),只要它們來(lái)自同一個(gè)作業(yè)。結(jié)果就是一個(gè)slot擁有這個(gè)作業(yè)的所有管道操作(pipeline)。允許這種slot共享有兩個(gè)主要的好處:
存儲(chǔ)鍵/值對(duì)索引的確切數(shù)據(jù)結(jié)構(gòu)取決于所選的狀態(tài)后端。一個(gè)狀態(tài)后端將數(shù)據(jù)存儲(chǔ)在內(nèi)存中的哈希映射中,另一個(gè)狀態(tài)后端使用[RocksDB]()作為鍵/值對(duì)存儲(chǔ)。除了定義保存狀態(tài)的數(shù)據(jù)結(jié)構(gòu)之外,狀態(tài)后端還實(shí)現(xiàn)邏輯以獲取鍵/值對(duì)狀態(tài)的時(shí)間點(diǎn)快照,并將該快照存儲(chǔ)為檢查點(diǎn)的一部分。
用Data Stream API編寫(xiě)的程序可以從保存點(diǎn)恢復(fù)執(zhí)行。保存點(diǎn)允許更新程序和Flink集群,而不會(huì)丟失任何狀態(tài)。
保存點(diǎn)是手動(dòng)觸發(fā)的檢查點(diǎn),它會(huì)獲取程序的快照并將其寫(xiě)入狀態(tài)后端。他們依靠常規(guī)的檢查點(diǎn)機(jī)制。在執(zhí)行期間,程序會(huì)定期在工作節(jié)點(diǎn)上創(chuàng)建快照并生成檢查點(diǎn)。對(duì)于恢復(fù),僅僅需要最后完成的檢查點(diǎn),因此一旦新的檢查點(diǎn)完成,就可以安全地丟棄舊的檢查點(diǎn)。
保存點(diǎn)與這些定期檢查點(diǎn)類似,不同之處在于它們由用戶觸發(fā),并且在較新的檢查點(diǎn)完成時(shí)不會(huì)自動(dòng)過(guò)期??梢詮拿钚谢蛲ㄟ^(guò)REST API取消作業(yè)時(shí)創(chuàng)建保存點(diǎn)。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。