原文鏈接:https://ci.apache.org/projects/flink/flink-docs-release-1.3/concepts/runtime.html#task-slots-and-resources
Tasks and Operator Chains(任務(wù)及操作鏈)
在分布式環(huán)境下尿招,F(xiàn)link將操作的子任務(wù)鏈在一起組成一個任務(wù),每一個任務(wù)在一個線程中執(zhí)行念秧。將操作鏈在一起時一個不錯的優(yōu)化:它減少了線程間的切換和緩沖糖埋,提升了吞吐量同時減低了時延匿级。這些鏈?zhǔn)叫袨槭强膳渲玫模斍檎堃?https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/datastream_api.html#task-chaining-and-resource-groups
下圖中的示例以5個子任務(wù)來運(yùn)行,因此有5個并發(fā)的線程
JobManagers, Task Managers, Clients
Flink的運(yùn)行時環(huán)境由兩個進(jìn)程組成:
JobManager:JobManager有時也叫Master冤留,主要是協(xié)調(diào)分布式運(yùn)行恩掷。他們調(diào)度任務(wù)倡鲸,協(xié)調(diào)checkpoint,協(xié)調(diào)失敗任務(wù)的恢復(fù)等等
一個Flink集群中至少有一臺JobManager節(jié)點(diǎn)黄娘。高可用性的集群中將會有多臺JobManager節(jié)點(diǎn)峭状,其中有一臺的leader節(jié)點(diǎn),其他的是備節(jié)點(diǎn)逼争。
TaskManager:TaskManager有時也叫Workers优床,TaskManager主要是執(zhí)行dataflow中的任務(wù),緩存數(shù)據(jù)以及進(jìn)行數(shù)據(jù)流的交換誓焦。
每一個集群中至少有一個TaskManager胆敞。
JobManager和TaskManager可以有多種啟動方式:直接在物理機(jī)上以standalone集群的形式啟動,在容器中啟動以及通過資源管理框架YARN或者M(jìn)esos來啟動杂伟。TaskManager與JobManager進(jìn)行通信移层,發(fā)送心跳信息來告知JobManager自己還處于活躍狀態(tài),同時接受JobManager分配的任務(wù)赫粥。
Client并不是運(yùn)行時環(huán)境或者程序運(yùn)行時的一部分观话,而是用來準(zhǔn)備數(shù)據(jù)流和將數(shù)據(jù)流發(fā)送到JobManager中。之后client可以斷開連接越平,或者繼續(xù)保持連接來接收處理報告匪燕。Client要么作為觸發(fā)執(zhí)行的Java/Scala程序的一部分蕾羊,或者是在命令行進(jìn)程./bin/flink run …中
TaskSlots and Resources
每一個worker(TaskManager)是一個JVM進(jìn)程,并在不同的線程中運(yùn)行著一個或者多個子任務(wù)帽驯。為了控制每個worker可接受的最大任務(wù)數(shù)龟再,每個worker需要有個task slots(任務(wù)槽)(至少有一個槽)。
每一個task slot代表著TaskManager的一個固定的資源子集尼变,例如一個TaskManager有三個slot的話利凑,意味著該TaskManager將會分配1/3的資源到每一個slot中去。將資源納入槽中意味著一個任務(wù)不會跟作業(yè)中的其他任務(wù)競爭托管內(nèi)存嫌术,而是會保留一定的托管內(nèi)存哀澈。
注意:現(xiàn)在的slot還沒有進(jìn)行CPU的隔離,當(dāng)前僅僅進(jìn)行了托管內(nèi)存的隔離度气。
通過調(diào)整slot的數(shù)量割按,用戶可以自定義多少個任務(wù)之間彼此隔離。一個TaskManager有一個slot意味著每一個任務(wù)運(yùn)行在一個獨(dú)立的JVM進(jìn)程中磷籍。有多個slot意味著多個任務(wù)共享一個JVM進(jìn)程适荣,共享JVM進(jìn)程的任務(wù)之間共享TCP連接和心跳信息,同時共享數(shù)據(jù)集和數(shù)據(jù)結(jié)構(gòu)院领,從而節(jié)省了每個任務(wù)的開銷弛矛。
默認(rèn)情況下,F(xiàn)link允許subtask(子任務(wù))之間共享slot比然,即使不是來自同一個task(任務(wù))丈氓,只要這些subtask(子任務(wù))來自同一個作業(yè)。允許slot共享的有兩個好處:
1强法、Flink集群需要與任務(wù)并發(fā)度一樣的的task slot(任務(wù)槽)万俗,不在需要再去計(jì)算一個程序中總共包含了多少了task(任務(wù))。
2饮怯、使得獲取更好的資源利用率變得更加容易该编,沒有slot共享的話,非密集型的source/map子任務(wù)將會拆分成與密集型的window子任務(wù)一樣多的資源硕淑。有了slot共享课竣,就可以提高任務(wù)的并發(fā)數(shù),從2個到6個置媳,充分利用了槽的資源于樟,也保證了子任務(wù)公平地分布在TaskManager集群中。
API中還包括了一個資源組機(jī)制拇囊,可以用來防止不需要的slot共享迂曲。資源組資料:https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/datastream_api.html#task-chaining-and-resource-groups
根據(jù)經(jīng)驗(yàn)法則,最好的slot數(shù)量配置是跟CPU核數(shù)一致寥袭,對于超線程路捧,每個slot可以分配兩個或者更多的硬件線程上下文关霸。
StateBackends
? ? ? ?存儲key/value鍵值索引的切確數(shù)據(jù)結(jié)構(gòu)取決于所選的state后端。一個state后端是將數(shù)據(jù)保存在內(nèi)存的哈希map中杰扫,另一個則是以key/value的形式保存在RocksDB中队寇。除了定義保存State的數(shù)據(jù)結(jié)構(gòu),State后端還實(shí)現(xiàn)了一個邏輯來獲取key/value state的時間點(diǎn)快照并作為checkpoint的一部分保存起來章姓。
Savepoints
? ? ? ?用DataStream API書寫的程序可以從一個savepoint中恢復(fù)執(zhí)行佳遣。Savepoint允許更新您的程序而不丟失Flink中的任何state信息。Savepoint是手動觸發(fā)checkpoint凡伊,獲取程序的快照并將快照寫入到state后端零渐。它們依靠定期的checkpoint機(jī)制,在執(zhí)行過程中程序在work節(jié)點(diǎn)上產(chǎn)生周期性快照系忙,并生成checkpoint诵盼。對于故障恢復(fù),只需要最新生成的checkpoint银还,舊的checkpoint可以在新的checkpoint生成之后就丟棄掉了风宁。
? ? ? Savepoint類似于周期性的checkpoint,除了他們是由用戶手動觸發(fā)的见剩,并且并不會在新的checkpoint生成之后而自動更新杀糯。Savepoint可以通過命令行生成或者在調(diào)用REST API取消一個作業(yè)時產(chǎn)生扫俺。