1. 程式人生 > 其它 >flink面試題高階1

flink面試題高階1

1. Flink Job的提交流程

使用者提交的Flink Job會被轉化成一個DAG任務執行,分別是:StreamGraph、JobGraph、ExecutionGraph,Flink中JobManager與TaskManager,JobManager與Client的互動是基於Akka工具包的,是通過訊息驅動。整個Flink Job的提交還包含著ActorSystem的建立,JobManager的啟動,TaskManager的啟動和註冊。

2. Flink所謂"三層圖"結構是哪幾個"圖"?

一個Flink任務的DAG生成計算圖大致經歷以下三個過程:

StreamGraph 最接近程式碼所表達的邏輯層面的計算拓撲結構,按照使用者程式碼的執行順序向StreamExecutionEnvironment新增StreamTransformation構成流式圖。

JobGraph 從StreamGraph生成,將可以串聯合並的節點進行合併,設定節點之間的邊,安排資源共享slot槽位和放置相關聯的節點,上傳任務所需的檔案,設定檢查點配置等。相當於經過部分初始化和優化處理的任務圖。

ExecutionGraph 由JobGraph轉換而來,包含了任務具體執行所需的內容,是最貼近底層實現的執行圖。

3. JobManger在叢集中扮演了什麼角色?

JobManager 負責整個 Flink 叢集任務的排程以及資源的管理,從客戶端中獲取提交的應用,然後根據叢集中 TaskManager 上 TaskSlot 的使用情況,為提交的應用分配相應的 TaskSlot 資源並命令 TaskManager 啟動從客戶端中獲取的應用。JobManager 相當於整個叢集的 Master 節點,且整個叢集有且只有一個活躍的 JobManager ,負責整個叢集的任務管理和資源管理。JobManager 和 TaskManager 之間通過 Actor System 進行通訊,獲取任務執行的情況並通過 Actor System 將應用的任務執行情況傳送給客戶端。同時在任務執行的過程中,Flink JobManager 會觸發 Checkpoint 操作,每個 TaskManager 節點 收到 Checkpoint 觸發指令後,完成 Checkpoint 操作,所有的 Checkpoint 協調過程都是在 Fink JobManager 中完成。當任務完成後,Flink 會將任務執行的資訊反饋給客戶端,並且釋放掉 TaskManager 中的資源以供下一次提交任務使用。

4. JobManger在叢集啟動過程中起到什麼作用?

JobManager的職責主要是接收Flink作業,排程Task,收集作業狀態和管理TaskManager。它包含一個Actor,並且做如下操作:

RegisterTaskManager: 它由想要註冊到JobManager的TaskManager傳送。註冊成功會通過AcknowledgeRegistration訊息進行Ack。

SubmitJob: 由提交作業到系統的Client傳送。提交的資訊是JobGraph形式的作業描述資訊。

CancelJob: 請求取消指定id的作業。成功會返回CancellationSuccess,否則返回CancellationFailure。

UpdateTaskExecutionState: 由TaskManager傳送,用來更新執行節點(ExecutionVertex)的狀態。成功則返回true,否則返回false。

RequestNextInputSplit: TaskManager上的Task請求下一個輸入split,成功則返回NextInputSplit,否則返回null。

JobStatusChanged: 它意味著作業的狀態(RUNNING, CANCELING, FINISHED,等)發生變化。這個訊息由ExecutionGraph傳送。

5. TaskManager在叢集中扮演了什麼角色?

TaskManager 相當於整個叢集的 Slave 節點,負責具體的任務執行和對應任務在每個節點上的資源申請和管理。客戶端通過將編寫好的 Flink 應用編譯打包,提交到 JobManager,然後 JobManager 會根據已註冊在 JobManager 中 TaskManager 的資源情況,將任務分配給有資源的 TaskManager節點,然後啟動並執行任務。TaskManager 從 JobManager 接收需要部署的任務,然後使用 Slot 資源啟動 Task,建立資料接入的網路連線,接收資料並開始資料處理。同時 TaskManager 之間的資料互動都是通過資料流的方式進行的。可以看出,Flink 的任務執行其實是採用多執行緒的方式,這和 MapReduce 多 JVM 進行的方式有很大的區別,Flink 能夠極大提高 CPU 使用效率,在多個任務和 Task 之間通過 TaskSlot 方式共享系統資源,每個 TaskManager 中通過管理多個 TaskSlot 資源池進行對資源進行有效管理。