1. 程式人生 > >《Apache Flink官方文件》分散式執行時環境

《Apache Flink官方文件》分散式執行時環境

原文連結   譯者:魏勇

任務與運算鏈

在實際的分散式計算環境中,Flink 會將多個運運算元任務連結到分散式計算任務中。每個執行緒執行一個計算任務。將運算子連結到計算任務中對於系統性能的提升有很大的幫助:它降低了執行緒間切換與緩衝的開銷,並且在降低延時的同時減少了系統的總體吞吐量。可以對這種連結操作進行配置,具體內容請參考連結文件

如下圖所示的資料流圖包含五個子任務,也就是說其中有五個併發執行的執行緒:

tasks_chains

作業管理器,工作管理員與客戶端

Flink 執行時環境由兩種型別程序組成:

  • 作業管理器(也稱為 master)用於協調程式的分散式執行。它的主要功能是排程任務,調整檢查點,並在任務失敗時安排恢復過程等。

每個 Flink 環境中只有一個作業管理器。未來的高可用設計中會包含多個作業管理器,其中一個是 leader,其他作為備份程式。

  • 工作管理員(也稱為 worker)用於執行資料流圖的任務(更準確地說,是計運算元任務),並對資料流進行緩衝、交換。

每個 Flink 環境中至少包含一個工作管理員。

可以以多種方式啟動作業管理器和工作管理員:直接作為獨立的叢集在機器上啟動,在容器中啟動,或者通過 YARNMesos 這類資源框架進行管理。啟動之後,工作管理員會主動上連到作業管理器來報告自身的狀態,以便作業管理器來分配任務。

客戶端的主要作用是準備並向作業管理器傳送資料流圖,它實際上並不是執行時環境的一個組成部分。在傳送完資料流圖之後,客戶端可以選擇斷開與作業管理器的連線,也可以繼續保持連線以等待程式執行結果。客戶端程式可以以 Java/Scala 程式的形式執行,也可以以命令列的形式(./bin/flink run ...

)執行。

processes

任務槽與資源

每個 worker(工作管理員)都是一個獨立的 JVM 程序,每個子任務就是執行在其中的獨立執行緒裡。為了控制 worker 接收任務的數量,在 worker 中引入了任務槽的概念(每個 worker 中至少包含一個任務槽)。

每個任務槽代表工作管理員中一個特定的資源池子集。例如,如果工作管理員有3個槽,它會為每個槽分配 1/3 的記憶體。將資源池槽化可以讓子任務獲取指定容量的記憶體資源,而避免同其他作業中的子任務競爭。注意,這裡沒有對 CPU 進行隔離;目前任務槽僅僅用於劃分任務的記憶體。

通過調整任務槽的數量,使用者可以設定子任務之間獨立執行的程度。如果工作管理員中只有一個槽,那麼每個任務組都會在一個獨立的 JVM(例如 JVM 可以在一個獨立的容器中啟動)中執行。工作管理員中配置更多的槽就意味著會有更多的子任務共享同一個 JVM。在同一個 JVM 中的任務會共享 TCP 連線(通過多路複用的方式)和心跳資訊,同時他們也會共享資料集和資料結構,這在某種程度上可以降低單任務的開銷。

tasks_slots

預設情況下,Flink 會允許同一個作業的多個子任務共享一個槽,即便這些子任務來自不同的任務。這種情況下,有可能會出現某個槽中包含一個完整的作業流水的場景。這樣做主要有兩點好處:

  • Flink 叢集需要在作業中確保任務槽數量和程式併發量完全一致,而並不需要計算程式中任務(每個任務的併發量也許都不相同)的具體數量。
  • 可以提高資源利用率。如果沒有任務槽共享機制,非密集型的 source/map() 子任務就會和密集型的 window 子任務一樣阻塞大量資源。如果有任務槽共享機制,在程式的併發量從 2 提高到 6 的情況下(舉個例子),就可以讓密集型子任務完全分散到工作管理員中,從而可以顯著提高槽的資源利用率。

slot_sharing

Flink API 中包含一個資源組機制,可以避免不合理的任務槽共享。

依照以往的經驗來說,預設的任務槽數量應設定為 CPU 核心的數量。如果使用超執行緒技術,每個槽中甚至可以排程處理超過 2 個硬體執行緒。

後端儲存

通過鍵值對索引的資料結構儲存在選定的後端儲存中。有的後端儲存將資料儲存在記憶體中的雜湊表中,而有的儲存會使用 RocksDB 來儲存鍵值對。除了定義儲存狀態的資料結構之外,後端儲存還實現了獲取鍵值對的特定時間點快照的功能,該功能可以將快照儲存為檢查點的一部分。

checkpoints

儲存點

使用資料流 API 的程式可以從指定的儲存點恢復。儲存點具備更新程式和 Flink 叢集而不丟失任何狀態的功能。

儲存點可以看作是一種手動觸發的檢查點,該檢查點可以獲取程式的快照並將其寫入後端儲存中。所以說儲存點的功能依賴於一般的檢查點機制。程式執行時會定期在 worker 節點生成快照和檢查點。由於 Flink 的恢復機制只需要使用最新一個有效的檢查點,在新的檢查點生成後就可以安全移除其餘舊的檢查點了。

儲存點和定期檢查點在大部分情況下都很相似,區別只在於儲存點是由使用者觸發的,並且在新的檢查點生成後不會自動過期失效。儲存點可以通過命令列生成,也可以在呼叫 REST API 取消作業時產生。