1 簡單介紹一下 Flink
Flink 是一個框架和分布式處理引擎,用於對無界和有界數據流進行有狀態計算。並且 Flink 提供了數據分布、容錯機制以及資源管理等核心功能。Flink提供了諸多高抽象層的API以便用戶編寫分布式任務:
DataSet API, 對靜態數據進行批處理操作,將靜態數據抽象成分布式的數據集,用戶可以方便地使用Flink提供的各種操作符對分布式數據集進行處理,支持Java、Scala和Python。
DataStream API,對數據流進行流處理操作,將流式的數據抽象成分布式的數據流,用戶可以方便地對分布式數據流進行各種操作,支持Java和Scala。
Table API,對結構化數據進行查詢操作,將結構化數據抽象成關系表,並通過類SQL的DSL對關系表進行各種查詢操作,支持Java和Scala。
此外,Flink 還針對特定的應用領域提供了領域庫,例如: Flink ML,Flink 的機器學習庫,提供了機器學習Pipelines API並實現了多種機器學習算法。 Gelly,Flink 的圖計算庫,提供了圖計算的相關API及多種圖計算算法實現。
2 Flink相比傳統的Spark Streaming區別?
這個問題是一個非常宏觀的問題,因為兩個框架的不同點非常之多。但是在面試時有非常重要的一點一定要回答出來:Flink 是標准的實時處理引擎,基於事件驅動。而 Spark Streaming 是微批(Micro-Batch)的模型。
下面我們就分幾個方面介紹兩個框架的主要區別:
1. 架構模型Spark Streaming 在運行時的主要角色包括:Master、Worker、Driver、Executor,Flink 在運行時主要包含:Jobmanager、Taskmanager和Slot。
2. 任務調度Spark Streaming 連續不斷的生成微小的數據批次,構建有向無環圖DAG,Spark Streaming 會依次創建 DStreamGraph、JobGenerator、JobScheduler。Flink 根據用戶提交的代碼生成 StreamGraph,經過優化生成 JobGraph,然后提交給 JobManager進行處理,JobManager 會根據 JobGraph 生成 ExecutionGraph,ExecutionGraph 是 Flink 調度最核心的數據結構,JobManager 根據 ExecutionGraph 對 Job 進行調度。
3. 時間機制Spark Streaming 支持的時間機制有限,只支持處理時間。 Flink 支持了流處理程序在時間上的三個定義:處理時間、事件時間、注入時間。同時也支持 watermark 機制來處理滯后數據。
4. 容錯機制對於 Spark Streaming 任務,我們可以設置 checkpoint,然后假如發生故障並重啟,我們可以從上次 checkpoint 之處恢復,但是這個行為只能使得數據不丟失,可能會重復處理,不能做到恰好一次處理語義。Flink 則使用兩階段提交協議來解決這個問題。
3 Flink 的運行必須依賴 Hadoop組件嗎?
Flink可以完全獨立於Hadoop,在不依賴Hadoop組件下運行。但是做為大數據的基礎設施,Hadoop體系是任何大數據框架都繞不過去的。Flink可以集成眾多Hadooop 組件,例如Yarn、Hbase、HDFS等等。例如,Flink可以和Yarn集成做資源調度,也可以讀寫HDFS,或者利用HDFS做檢查點。
4 Flink的並行度了解嗎?Flink的並行度設置是怎樣的?
Flink中的任務被分為多個並行任務來執行,其中每個並行的實例處理一部分數據。這些並行實例的數量被稱為並行度。我們在實際生產環境中可以從四個不同層面設置並行度:
操作算子層面(Operator Level)
執行環境層面(Execution Environment Level)
客戶端層面(Client Level)
系統層面(System Level)
需要注意的優先級:算子層面>環境層面>客戶端層面>系統層面。