<meta name="source" content="lake">
Google File System
Big Table
Map Reduce
HDFS
HBase
Hadoop
Hadoop 基于硬盤棉胀,可以處理海量數(shù)據(jù)垢乙;
Spark 基于內(nèi)存释移,性能提高百倍祖秒,微批(500ms)究反;
Flink 基于 Google Dataflow Model(2015)聂喇,真正的實(shí)時(shí)框架辖源;
Beam 寫一套代碼,可以運(yùn)行在 Spark 和 Flink 引擎上希太。
Flink 用于對(duì)無(wú)界和有界數(shù)據(jù)流進(jìn)行狀態(tài)計(jì)算
- 低延遲(Spark Streaming的延遲是秒級(jí)克饶,F(xiàn)link延遲是毫秒級(jí))
- 高吞吐(阿里雙十一使用Flink處理4.6PB,雙十一大屏)
- 結(jié)果的準(zhǔn)確性和良好的容錯(cuò)性(exactly-once)
Lambda 架構(gòu)
批處理 + 流處理
流處理系統(tǒng)為了更快看到結(jié)果誊辉,批處理保證精準(zhǔn)性矾湃,
在Flink之前都不能做這樣一點(diǎn),F(xiàn)link是批流統(tǒng)一的堕澄。
Flink 主要特點(diǎn)
事件驅(qū)動(dòng)
來(lái)一條數(shù)據(jù)邀跃,出發(fā)一次算子的計(jì)算,事件驅(qū)動(dòng)
后端事件驅(qū)動(dòng)的代表:netty
大數(shù)據(jù)最難學(xué)習(xí)的框架:Flink
后端最難學(xué)習(xí)的是:netty
前端最難學(xué)習(xí)的是:Rxjs
編程里最難學(xué)習(xí)的是:函數(shù)式編程
基于流的世界觀(流批統(tǒng)一)
在 Flink 中蛙紫,一切都是由流組成的拍屑,離線數(shù)據(jù)是無(wú)界的流,用流來(lái)模擬批坑傅。
Flink 分層API
- 越頂層越抽象僵驰,表達(dá)含義越簡(jiǎn)明,使用越方便
- 越底層越具體,表達(dá)能力越豐富蒜茴,使用越靈活
Flink 其它特點(diǎn)
- 支持事件時(shí)間和處理時(shí)間語(yǔ)義
- 精確一次的狀態(tài)一致性保證
- 低延遲(毫秒級(jí))
- 和很多大數(shù)據(jù)中間接連接
事件時(shí)間:事件真實(shí)發(fā)生的時(shí)間星爪,要求數(shù)據(jù)中有時(shí)間戳
處理時(shí)間:事件到達(dá)節(jié)點(diǎn)
Flink vs Spark Streaming
Spark 采用 RDD 模型,RDD的集合
Flink 基本數(shù)據(jù)模型是數(shù)據(jù)流矮男,以及事件序列
選型
運(yùn)行時(shí)架構(gòu)
Flink wordcount
創(chuàng)建 IDEA -> Maven 項(xiàng)目 -> Add Archetype
- org.apache.flink
- flink-quickstart-scala
- 1.10.0
選擇某項(xiàng)目原型,點(diǎn)擊 Next
設(shè)置項(xiàng)目名以及我們組織的一些信息(可選)
任務(wù)提交流程(獨(dú)立集群)
image.png
程序的并行度設(shè)置為10室谚,那么并行任務(wù)的數(shù)量就是10毡鉴,任務(wù)管理器會(huì)向資源管理器請(qǐng)求10個(gè)任務(wù)槽。
Yarn
可以讀成雅安秒赤,
任務(wù)調(diào)度原理
Flink 程序 編譯之后猪瞬,可能有一定的優(yōu)化,然后成為一個(gè) Dataflow Graph入篮,通過(guò)Actor System (異步I/O)提交陈瘦,發(fā)送心跳信息確認(rèn)是否還活著。
Flink 中每個(gè) TaskManager 都是一個(gè) JVM 進(jìn)程潮售,每一個(gè) task slot 都會(huì)啟動(dòng)一個(gè)線程痊项,它可能會(huì)在獨(dú)立的線程上執(zhí)行一個(gè)或多個(gè) subtask,每一個(gè) task 占用一個(gè) task slot
為了控制一個(gè) TaskManager 能接受多少個(gè) task酥诽,TaskManager 通過(guò) task slot 來(lái)進(jìn)行控制(一個(gè) TaskManager 至少有一個(gè) slot)
每一個(gè)算子后面都可以設(shè)置一個(gè)并行度鞍泉,比如上圖 sink 并行度是1,其他算子是 2
可以在 flink-conf.yaml 配置文件中設(shè)置每個(gè) TaskManager 默認(rèn)插槽(slot)數(shù)量肮帐。
假設(shè)目前3個(gè) TaskManager咖驮,則有9個(gè)slot,若設(shè)置并行度為1训枢,那么空閑8個(gè)slot托修。
任務(wù)槽是個(gè)靜態(tài)的概念,可以寫死恒界,但是并行度是一個(gè)動(dòng)態(tài)的概念睦刃,在我們的編程中可以動(dòng)態(tài)修改。
程序與數(shù)據(jù)流
- 所有的 Flink 程序都是由三部分組成的:Source十酣、Transformation 和 Sink眯勾。
- Source 負(fù)責(zé)讀取數(shù)據(jù)源,Transformation 利用各種算子進(jìn)行處理加工婆誓,Sink 負(fù)責(zé)輸出/持久化吃环。
所以在運(yùn)行的時(shí)候,F(xiàn)link 程序會(huì)被映射成 dataflow洋幻,包含以上三部分郁轻,dataflow 類似于有向無(wú)環(huán)圖(DAG),在大部分情況下,transformation 跟 dataflow 中的算子是一一對(duì)應(yīng)的關(guān)系好唯。
執(zhí)行圖
StreamGraph
寫的代碼通過(guò) Stream API 編寫的代碼生成的最初的圖竭沫,用來(lái)表示程序的拓?fù)浣Y(jié)構(gòu)。
JobGraph
經(jīng)過(guò)優(yōu)化后生成了 JobGraph骑篙,提交給 JobManager的數(shù)據(jù)結(jié)構(gòu)就是這種蜕提,主要優(yōu)化為將多個(gè)符合條件的算子 chain 在一起作為一個(gè)節(jié)點(diǎn)。
ExecutionGraph
JobGraph 的并行化版本靶端,是調(diào)度層的最核心的數(shù)據(jù)結(jié)構(gòu)谎势。
Flink 運(yùn)行時(shí)組件
分發(fā)器
CheckPoint機(jī)制
容錯(cuò)
Flink 會(huì)在指定的時(shí)間段上保存狀態(tài)信息,如果 Flink 掛了就可以把上一次狀態(tài)信息再撈出來(lái)杨名。
Flink 本身就是有狀態(tài)的脏榆,F(xiàn)link 可以讓你選擇執(zhí)行過(guò)程中的數(shù)據(jù)保存在哪里,在 Flink 中稱作 State Backends 台谍,CheckPoint 也是保存在這之上
- MemoryStateBackend
- FsStateBackend
- RocksDBStateBackend
即
- 內(nèi)存
- 文件系統(tǒng) HDFS
- 本地?cái)?shù)據(jù)庫(kù)
精確一次 exactly-once
DataStream API
checkpoint 的存儲(chǔ)
可以是內(nèi)存须喂、文件系統(tǒng) HDFS 或 RocksDB
開發(fā)角度的大致流程
Flink 程序 -> StreamGraph -> JobGraph -> ExecutionGraph -> 物理執(zhí)行圖
面試題
Flink vs Spark Streaming
Flink 是真正的流處理,延遲在毫秒級(jí)
Flink 可以處理事件時(shí)間趁蕊,多種時(shí)間語(yǔ)義
Flink CheckPoint 機(jī)制比 Spark 更靈活坞生,性能更高
Flink 易于實(shí)現(xiàn)端到端一致性
CheckPoint 存在哪里
內(nèi)存、文件系統(tǒng)掷伙、RocksDB
三 Flink 部署
四 Flink 運(yùn)行時(shí)架構(gòu)
主要包括四個(gè)不同的組件
- 作業(yè)管理器 JobManager
- 資源管理器 ResourceManager
- 任務(wù)管理器 TaskManager
- 分發(fā)器 Dispatcher
Flink 是用 Java 和 Scala 實(shí)現(xiàn)的恨胚,所有組件都會(huì)運(yùn)行在 JVM 上
Flink 時(shí)間概念和應(yīng)用場(chǎng)景?
- 事件時(shí)間炎咖,一般數(shù)據(jù)中要帶當(dāng)時(shí)的時(shí)間戳赃泡,例如軌跡點(diǎn)數(shù)據(jù)有被采集時(shí)的時(shí)間戳
- 處理時(shí)間,執(zhí)行操作算子的本地系統(tǒng)時(shí)間乘盼,與機(jī)器相關(guān)
- 攝取時(shí)間升熊,數(shù)據(jù)進(jìn)入 Flink 的時(shí)間。多個(gè)數(shù)據(jù)源算子的情況下绸栅,每個(gè)數(shù)據(jù)源算子會(huì)使用本地系統(tǒng)時(shí)鐘指派攝取時(shí)間级野,后續(xù)基于時(shí)間的相關(guān)操作中,都會(huì)使用數(shù)據(jù)記錄中的攝取時(shí)間粹胯。
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
可以設(shè)置時(shí)間類型
設(shè)置水位線 Watermark 蓖柔,即遇到了一個(gè)時(shí)間戳達(dá)到了窗口關(guān)閉時(shí)間,不應(yīng)該立刻觸發(fā)窗口于計(jì)算风纠,而是等待一段時(shí)間况鸣,等遲到的數(shù)據(jù)來(lái)了再關(guān)閉窗口
Watermark 可以正確的處理亂序時(shí)間,通常用 Watermark 機(jī)制結(jié)合 window 來(lái)實(shí)現(xiàn)竹观,window 的執(zhí)行也是由 Watermark 觸發(fā)的镐捧。
滑動(dòng)窗口
這個(gè)元素屬于 n 個(gè)窗口潜索,需要復(fù)制多份。比如 (Value, 6s) 代表在 6s 到達(dá)的數(shù)據(jù)懂酱,它屬于 [0s, 10s] 和 [5s, 15s] 竹习。