Flink學習-分佈式運行環境

目錄

任務和算子鏈

Job Managers, Task Managers, Clients

Task Slots and Resources

State Backends

Savepoints


任務和算子鏈

分佈式計算中,Flink會將算子(operator) 的子task鏈式組成tasks,每個task由一個線程執行。把算子鏈化爲tasks是一個非常好的優化:它減少了線程之間的通信和緩衝,而且還能增加吞吐量降低延遲。

下圖中dataflow有5個subtasks,因此有5個線程併發進行處理。

Job Managers, Task Managers, Clients

Flink運行時包含兩類進程:

  • JobManagers (也稱爲 masters)用來協調分佈式計算。負責進行任務調度,協調checkpoints,協調錯誤恢復等等。至少需要一個JobManager。高可用部署下會有多個JobManagers,其中一個作爲leader,其餘處於standby狀態。
  • TaskManagers(也稱爲 workers)真正執行dataflow中的tasks(更準確的描述是,subtasks),並且對 streams進行緩存和交換。至少需要一個TaskManager。

有多種方式可以啓動JobManagers和TaskManagers:直接在計算機上啓動作爲 standalone cluster ,在容器中或者由資源管理器YARN或者 Mesos啓動。 TaskManagers連接到JobManagers後,會通知JobManagers自己已可用,接着被分配工作。

client 不作爲運行時(runtime)和程序執行的一部分,只是用於準備和發送dataflow作業給JobManager。 因此客戶端可以斷開連接,或者保持連接以接收進度報告。客戶端可以作爲觸發執行的Java/Scala 程序的一部分或者運行在命令行進程中./bin/flink run ...

Task Slots and Resources

每個worker(TaskManager)都是一個JVM 進程,並且可以在不同的線程中執行一個或多個subtasks。每個worker用task slots(任務槽位) (至少有一個)來控制可以接收多少個tasks。

每個task slot代表TaskManager中一個固定的資源子集。例如,有3個slots的TaskManager會將它的內存資源劃分成3份分配給每個slot。劃分資源意味着subtask不會和來自其他作業的subtasks競爭資源,但是也意味着它只擁有固定的內存資源。注意劃分資源不進行CPU隔離,只劃分內存資源給不同的tasks。

通過調整slots的個數進而可以調整subtasks之間的隔離方式。當每個TaskManager只有一個slot時,意味着每個task group運行在不同的JVM中(例如:可能在不同的container中)。當每個TaskManager有多個slots時,意味着多個subtasks可以共享同一個JVM。同一個JVM中的tasks共享TCP連接(通過多路複用技術)和心跳消息。可能還會共享數據集和數據結構,從而減少每個task的開銷。

默認情況下,只要subtasks是來自同一個job,Flink允許不同tasks的subtasks共享slots。因此,一個slot可能會負責job的整個pipeline。允許slot sharing有兩個好處:

  • Flink集羣需要的slots的數量和job的最高併發度相同,不需要計算一個作業總共包含多少個tasks(具有不同並行度)。
  • 更易獲取更好的資源利用率。沒有slot sharing,非集中型subtasks(source/map())將會佔用和集中型subtasks (window)一樣多的資源。在我們的示例中,允許共享slot,可以將示例作業的併發度從2增加到6,從而可以充分利用資源,同時保證負載很重的subtasks可以在TaskManagers中平均分配。

APIs還包含了一種 *資源組(resource group)*機制,用來防止不必要的slot sharing。

經驗來講,task slots的默認值應該與CPU核數一致。在使用超線程下,一個slot將會佔用2個或更多的硬件資源。

State Backends

key/values索引存儲的準確數據結構取決於選擇的state backend。其中一個 state backend將數據存儲在內存hash map中,另一個 state backend使用RocksDB作爲key/value 存儲。 除了定義存儲狀態的數據結構, state backends還實現了獲取 key/value狀態的時間點快照的邏輯,並將該快照存儲爲checkpoint的一部分。

Savepoints

使用Data Stream API編寫的程序可以從一個savepoint恢復執行。Savepoints允許在不丟失任何狀態的情況下修改程序和Flink集羣。

Savepoints是手動觸發的checkpoints,它依賴常規的checkpointing機制,生成程序快照並將其寫入到狀態後端。在運行期間,worker節點週期性的生成程序快照併產生checkpoints。在恢復重啓時只會使用最後成功的checkpoint。並且只要有一個新的checkpoint生成時,舊的checkpoints將會被安全地丟棄。

Savepoints與週期性觸發的checkpoints很類似,但是其式由由用戶觸發的,且當更新的checkpoints完成時,老的checkpoint不會自動失效。可以通過命令行或者在取消一個job時調用REST API的方式創建Savepoints。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章