溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Flink相關(guān)面試題有哪些

發(fā)布時(shí)間:2021-12-31 10:29:51 來源:億速云 閱讀:121 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Flink相關(guān)面試題有哪些”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

一、Flink Job的提交流程

用戶提交的Flink Job會(huì)被轉(zhuǎn)化成一個(gè)DAG任務(wù)運(yùn)行,分別是:StreamGraph、JobGraph、ExecutionGraph,F(xiàn)link中JobManager與TaskManager,JobManager與Client的交互是基于Akka工具包的,是通過消息驅(qū)動(dòng)。整個(gè)Flink Job的提交還包含著ActorSystem的創(chuàng)建,JobManager的啟動(dòng),TaskManager的啟動(dòng)和注冊。

二、Flink所謂"三層圖"結(jié)構(gòu)是哪幾個(gè)"圖"?

一個(gè)Flink任務(wù)的DAG生成計(jì)算圖大致經(jīng)歷以下三個(gè)過程:

  • StreamGraph
    最接近代碼所表達(dá)的邏輯層面的計(jì)算拓?fù)浣Y(jié)構(gòu),按照用戶代碼的執(zhí)行順序向StreamExecutionEnvironment添加StreamTransformation構(gòu)成流式圖。

  • JobGraph
    從StreamGraph生成,將可以串聯(lián)合并的節(jié)點(diǎn)進(jìn)行合并,設(shè)置節(jié)點(diǎn)之間的邊,安排資源共享slot槽位和放置相關(guān)聯(lián)的節(jié)點(diǎn),上傳任務(wù)所需的文件,設(shè)置檢查點(diǎn)配置等。相當(dāng)于經(jīng)過部分初始化和優(yōu)化處理的任務(wù)圖。

  • ExecutionGraph
    由JobGraph轉(zhuǎn)換而來,包含了任務(wù)具體執(zhí)行所需的內(nèi)容,是最貼近底層實(shí)現(xiàn)的執(zhí)行圖。

三、JobManger在集群中扮演了什么角色?

JobManager 負(fù)責(zé)整個(gè) Flink 集群任務(wù)的調(diào)度以及資源的管理,從客戶端中獲取提交的應(yīng)用,然后根據(jù)集群中 TaskManager 上 TaskSlot 的使用情況,為提交的應(yīng)用分配相應(yīng)的 TaskSlot 資源并命令 TaskManager 啟動(dòng)從客戶端中獲取的應(yīng)用。

JobManager 相當(dāng)于整個(gè)集群的 Master 節(jié)點(diǎn),且整個(gè)集群有且只有一個(gè)活躍的 JobManager ,負(fù)責(zé)整個(gè)集群的任務(wù)管理和資源管理。

JobManager 和 TaskManager 之間通過 Actor System 進(jìn)行通信,獲取任務(wù)執(zhí)行的情況并通過 Actor System 將應(yīng)用的任務(wù)執(zhí)行情況發(fā)送給客戶端。

同時(shí)在任務(wù)執(zhí)行的過程中,F(xiàn)link JobManager 會(huì)觸發(fā) Checkpoint 操作,每個(gè) TaskManager 節(jié)點(diǎn) 收到 Checkpoint 觸發(fā)指令后,完成 Checkpoint 操作,所有的 Checkpoint 協(xié)調(diào)過程都是在 Fink JobManager 中完成。

當(dāng)任務(wù)完成后,F(xiàn)link 會(huì)將任務(wù)執(zhí)行的信息反饋給客戶端,并且釋放掉 TaskManager 中的資源以供下一次提交任務(wù)使用。

四、JobManger在集群啟動(dòng)過程中起到什么作用?

JobManager的職責(zé)主要是接收Flink作業(yè),調(diào)度Task,收集作業(yè)狀態(tài)和管理TaskManager。它包含一個(gè)Actor,并且做如下操作:

  • RegisterTaskManager: 它由想要注冊到JobManager的TaskManager發(fā)送。注冊成功會(huì)通過AcknowledgeRegistration消息進(jìn)行Ack。

  • SubmitJob: 由提交作業(yè)到系統(tǒng)的Client發(fā)送。提交的信息是JobGraph形式的作業(yè)描述信息。

  • CancelJob: 請求取消指定id的作業(yè)。成功會(huì)返回CancellationSuccess,否則返回CancellationFailure。

  • UpdateTaskExecutionState: 由TaskManager發(fā)送,用來更新執(zhí)行節(jié)點(diǎn)(ExecutionVertex)的狀態(tài)。成功則返回true,否則返回false。

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

  • JobStatusChanged:它意味著作業(yè)的狀態(tài)(RUNNING, CANCELING, FINISHED,等)發(fā)生變化。這個(gè)消息由ExecutionGraph發(fā)送。

五、TaskManager在集群中扮演了什么角色?

TaskManager 相當(dāng)于整個(gè)集群的 Slave 節(jié)點(diǎn),負(fù)責(zé)具體的任務(wù)執(zhí)行和對應(yīng)任務(wù)在每個(gè)節(jié)點(diǎn)上的資源申請和管理。

客戶端通過將編寫好的 Flink 應(yīng)用編譯打包,提交到 JobManager,然后 JobManager 會(huì)根據(jù)已注冊在 JobManager 中 TaskManager 的資源情況,將任務(wù)分配給有資源的 TaskManager節(jié)點(diǎn),然后啟動(dòng)并運(yùn)行任務(wù)。

TaskManager 從 JobManager 接收需要部署的任務(wù),然后使用 Slot 資源啟動(dòng) Task,建立數(shù)據(jù)接入的網(wǎng)絡(luò)連接,接收數(shù)據(jù)并開始數(shù)據(jù)處理。同時(shí) TaskManager 之間的數(shù)據(jù)交互都是通過數(shù)據(jù)流的方式進(jìn)行的。

可以看出,F(xiàn)link 的任務(wù)運(yùn)行其實(shí)是采用多線程的方式,這和 MapReduce 多 JVM 進(jìn)行的方式有很大的區(qū)別,F(xiàn)link 能夠極大提高 CPU 使用效率,在多個(gè)任務(wù)和 Task 之間通過 TaskSlot 方式共享系統(tǒng)資源,每個(gè) TaskManager 中通過管理多個(gè) TaskSlot 資源池進(jìn)行對資源進(jìn)行有效管理。

六、TaskManager在集群啟動(dòng)過程中起到什么作用? 

TaskManager的啟動(dòng)流程較為簡單:
啟動(dòng)類:org.apache.flink.runtime.taskmanager.TaskManager
核心啟動(dòng)方法 :selectNetworkInterfaceAndRunTaskManager
啟動(dòng)后直接向JobManager注冊自己,注冊完成后,進(jìn)行部分模塊的初始化。

七、Flink 計(jì)算資源的調(diào)度是如何實(shí)現(xiàn)的?

TaskManager中最細(xì)粒度的資源是Task slot,代表了一個(gè)固定大小的資源子集,每個(gè)TaskManager會(huì)將其所占有的資源平分給它的slot。

通過調(diào)整 task slot 的數(shù)量,用戶可以定義task之間是如何相互隔離的。每個(gè) TaskManager 有一個(gè)slot,也就意味著每個(gè)task運(yùn)行在獨(dú)立的 JVM 中。每個(gè) TaskManager 有多個(gè)slot的話,也就是說多個(gè)task運(yùn)行在同一個(gè)JVM中。

而在同一個(gè)JVM進(jìn)程中的task,可以共享TCP連接(基于多路復(fù)用)和心跳消息,可以減少數(shù)據(jù)的網(wǎng)絡(luò)傳輸,也能共享一些數(shù)據(jù)結(jié)構(gòu),一定程度上減少了每個(gè)task的消耗。
每個(gè)slot可以接受單個(gè)task,也可以接受多個(gè)連續(xù)task組成的pipeline,如下圖所示,F(xiàn)latMap函數(shù)占用一個(gè)taskslot,而key Agg函數(shù)和sink函數(shù)共用一個(gè)taskslot:

Flink相關(guān)面試題有哪些

八、簡述Flink的數(shù)據(jù)抽象及數(shù)據(jù)交換過程?

Flink 為了避免JVM的固有缺陷例如java對象存儲密度低,F(xiàn)GC影響吞吐和響應(yīng)等,實(shí)現(xiàn)了自主管理內(nèi)存。MemorySegment就是Flink的內(nèi)存抽象。默認(rèn)情況下,一個(gè)MemorySegment可以被看做是一個(gè)32kb大的內(nèi)存塊的抽象。這塊內(nèi)存既可以是JVM里的一個(gè)byte[],也可以是堆外內(nèi)存(DirectByteBuffer)。

在MemorySegment這個(gè)抽象之上,F(xiàn)link在數(shù)據(jù)從operator內(nèi)的數(shù)據(jù)對象在向TaskManager上轉(zhuǎn)移,預(yù)備被發(fā)給下個(gè)節(jié)點(diǎn)的過程中,使用的抽象或者說內(nèi)存對象是Buffer。

對接從Java對象轉(zhuǎn)為Buffer的中間對象是另一個(gè)抽象StreamRecord。

九、Flink 中的分布式快照機(jī)制是如何實(shí)現(xiàn)的?

Flink的容錯(cuò)機(jī)制的核心部分是制作分布式數(shù)據(jù)流和操作算子狀態(tài)的一致性快照。這些快照充當(dāng)一致性checkpoint,系統(tǒng)可以在發(fā)生故障時(shí)回滾。Flink用于制作這些快照的機(jī)制在“分布式數(shù)據(jù)流的輕量級異步快照”中進(jìn)行了描述。它受到分布式快照的標(biāo)準(zhǔn)Chandy-Lamport算法的啟發(fā),專門針對Flink的執(zhí)行模型而定制。

Flink相關(guān)面試題有哪些

barriers在數(shù)據(jù)流源處被注入并行數(shù)據(jù)流中??煺課的barriers被插入的位置(我們稱之為Sn)是快照所包含的數(shù)據(jù)在數(shù)據(jù)源中最大位置。例如,在Apache Kafka中,此位置將是分區(qū)中最后一條記錄的偏移量。將該位置Sn報(bào)告給checkpoint協(xié)調(diào)器(Flink的JobManager)。

然后barriers向下游流動(dòng)。當(dāng)一個(gè)中間操作算子從其所有輸入流中收到快照n的barriers時(shí),它會(huì)為快照n發(fā)出barriers進(jìn)入其所有輸出流中。一旦sink操作算子(流式DAG的末端)從其所有輸入流接收到barriers n,它就向checkpoint協(xié)調(diào)器確認(rèn)快照n完成。在所有sink確認(rèn)快照后,意味快照著已完成。

一旦完成快照n,job將永遠(yuǎn)不再向數(shù)據(jù)源請求Sn之前的記錄,因?yàn)榇藭r(shí)這些記錄(及其后續(xù)記錄)將已經(jīng)通過整個(gè)數(shù)據(jù)流拓?fù)?,也即是已?jīng)被處理結(jié)束。

十、簡單說說FlinkSQL的是如何實(shí)現(xiàn)的?

Flink 將 SQL 校驗(yàn)、SQL 解析以及 SQL 優(yōu)化交給了Apache Calcite。Calcite 在其他很多開源項(xiàng)目里也都應(yīng)用到了,譬如 Apache Hive, Apache Drill, Apache Kylin, Cascading。Calcite 在新的架構(gòu)中處于核心的地位,如下圖所示。

Flink相關(guān)面試題有哪些

構(gòu)建抽象語法樹的事情交給了 Calcite 去做。SQL query 會(huì)經(jīng)過 Calcite 解析器轉(zhuǎn)變成 SQL 節(jié)點(diǎn)樹,通過驗(yàn)證后構(gòu)建成 Calcite 的抽象語法樹(也就是圖中的 Logical Plan)。另一邊,Table API 上的調(diào)用會(huì)構(gòu)建成 Table API 的抽象語法樹,并通過 Calcite 提供的 RelBuilder 轉(zhuǎn)變成 Calcite 的抽象語法樹。然后依次被轉(zhuǎn)換成邏輯執(zhí)行計(jì)劃和物理執(zhí)行計(jì)劃。

在提交任務(wù)后會(huì)分發(fā)到各個(gè) TaskManager 中運(yùn)行,在運(yùn)行時(shí)會(huì)使用 Janino 編譯器編譯代碼后運(yùn)行。

“Flink相關(guān)面試題有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI