Flink技術內幕:架構設計與實現(xiàn)原理
定 價:99 元
叢書名:大數(shù)據(jù)技術叢書
- 作者:羅江宇,趙士杰,李涵淼,閔文俊
- 出版時間:2021/12/1
- ISBN:9787111696292
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:TP274
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
內容簡介
這是一部從源代碼角度出發(fā),通過分析Flink的各個功能模塊的實現(xiàn)來剖析Flink的架構設計和實現(xiàn)原理的著作。它將能指導讀者更好地對Flink進行性能調優(yōu)、可用性保障、效能優(yōu)化和二次開發(fā)。
四位作者都是非常資深的Flink專家,部分作者是Flink源代碼的維護者和改造者,本書總結了他們在阿里巴巴、螞蟻集團、滴滴等企業(yè)的大規(guī)模Flink實踐經(jīng)驗。
全書共11章,主要內容如下。
第1章 閱讀Flink源代碼前的準備
主要介紹了Flink源代碼的獲取、編譯、調試,以及它的目錄結構、設計理念和基本架構。此外,還分析了Flink與Hadoop MapReduce、Spark在設計上的差異。
第2~8章 Flink功能模塊源代碼和架構解析
從源碼角度分析了Flink的編程模型與API、運行時組件與通信、狀態(tài)管理與容錯、任務提交與執(zhí)行、Flink網(wǎng)絡棧、Flink Connector、部署模式等功能模塊的原理。力求讓讀者深入理解Flink的原理,而不只是跟著本書讀一遍Flink源代碼。原理和思想是不局限于某一個框架和技術,了解了Flink的原理和思想,可以將其擴展到其他框架和技術上。
第9~10章 Flink Table、SQL與Flink CEP
編程方式逐漸從原先基于Map-Reduce的任務模式向SQL化演進,SQL意味著標準和效率。這兩章重點講解了StreamTableEnvironment的實現(xiàn)過程、SQL的解析過程、Table Connector以及Flink CEP的內部實現(xiàn)原理。
第11章 Flink監(jiān)控
主要講解了Flink的監(jiān)控指標、常用系統(tǒng)指標和監(jiān)控體系的建設,以及常用的定位手段。
作者背景資深:4位作者均是Flink的早期實踐者和布道者,不僅參與了國內早期的Flink項目,而且參與Flink源碼的維護和改造。大廠經(jīng)驗總結:作者在阿里巴巴、螞蟻集團、滴滴等企業(yè)參與和主導了多個Flink項目從0到1的過程,本書是他們在這些企業(yè)大規(guī)模應用Flink的經(jīng)驗總結。源碼全面剖析:本書從源碼角度深入剖析了Flink各功能模塊的架構與實現(xiàn),能指導讀者更好地進行性能調優(yōu)、可用性保障、效能優(yōu)化、二次開發(fā)
為什么要寫本書
近些年來,流計算技術發(fā)展迅速,被廣泛應用于數(shù)據(jù)ETL、數(shù)據(jù)BI、實時數(shù)據(jù)倉庫建設和AI等方面。Flink作為流計算領域的一顆璀璨的明星,自問世以來發(fā)展迅猛,其技術生態(tài)圈也日益壯大,現(xiàn)已成為Apache開源項目中活躍的項目之一。很多企業(yè)選擇用Flink來構建其流計算體系或流批一體體系,使用on YARN或on Kubernetes部署模式來進行大規(guī)模生產(chǎn)。
轉眼間,我從事Flink研發(fā)工作已經(jīng)4年,其間我對Flink 的1.2、1.3、1.5、1 .8、1.9、1.11 和1.13版本源代碼進行維護和改造,提供Flink 大規(guī)模集群生產(chǎn)支持,并在公司內提供業(yè)務解決方案。在為業(yè)務方提供支持的過程中,我逐漸萌生寫一本剖析Flink內部機制的書的想法,原因有二。
其一,隨著流計算的流行和應用于大規(guī)模生產(chǎn),公司對Flink的性能、可用性和效能等方面的要求更加迫切,因而更加需要流計算方面的人才,尤其是擁有Flink性能調優(yōu)、可用性和效能等方面經(jīng)驗的人才。而單純查看官方文檔,對Flink機制的認識只能流于黑盒形式。只有深入源代碼才能深刻理解Flink 的內部機制,才能更好地進行性能調優(yōu),做好可用性保障和優(yōu)化,以及做好效能方面的優(yōu)化。
其二,市場上缺少深入剖析Flink源代碼和設計的圖書。我希望借助自己多年從事大規(guī)模生產(chǎn)以及進行多個Flink 版本維護與改造的經(jīng)驗,對Flink 的設計與實現(xiàn)進行深入剖析,幫助讀者更好地了解Flink源代碼與機制。
通過了解源代碼,讀者能有以下收獲:
編寫出更健壯的流計算代碼;
更好地對流計算作業(yè)進行調優(yōu),使得作業(yè)性能更高;
更好地維護Flink引擎,并對Flink引擎進行二次開發(fā)。
讀者對象
本書適合以下幾類人員閱讀:
流計算開發(fā)人員、大數(shù)據(jù)開發(fā)人員;
大數(shù)據(jù)架構人員;
對Flink計算引擎底層感興趣的相關人員。
本書特色
基于使用方式及其背后的原理、原理背后的設計及源代碼實現(xiàn)來剖析Flink內部機制,由淺入深。
盡量用圖來展示原理和機制,以便于讀者理解。
盡可能結合實際生產(chǎn)分析Flink 內部機制,對讀者的實際生產(chǎn)具有指導意義。
講解的設計和實現(xiàn)原理有助于讀者提升架構設計與實現(xiàn)能力。
本書結構與內容
本書基于Flink 1.9版本的源代碼來解析Flink。全書共11章,主要內容如下。
第1章 閱讀Flink源代碼前的準備
主要介紹Flink源代碼閱讀環(huán)境準備以及Flink的設計理念和基本架構,包括Flink源代碼的導入流程和調試方式,F(xiàn)link與Hadoop MapReduce、Spark的設計差異,以及Flink的分層架構和運行時架構。
第2章 編程模型與API
主要介紹Flink DataStream的算子的使用和實現(xiàn)原理。首先講解DataStream底層的轉換,接著介紹常用算子(如FlatMap、Join、Aggregation、Union),后解析窗口的設計與實現(xiàn)。
第3章 運行時組件與通信
深入剖析運行時組件、組件間通信及運行時組件的高可用。首先介紹運行時組件REST、Dispatcher、ResourceManager、JobMaster和TaskExecutor,接著介紹運行時組件間通信的框架Akka,并以Slot申請為例講解運行時組件之間的通信,后介紹運行時組件高可用的功能、存在的問題及其解決方案。
第4章 狀態(tài)管理與容錯
從狀態(tài)、檢查點、狀態(tài)后端三個概念入手,對Flink狀態(tài)管理和容錯的設計與實現(xiàn)進行深度剖析。
第5章 任務提交與執(zhí)行
主要介紹Flink任務提交的整個流程,從客戶端、JobManager和TaskManager端對應任務各個階段的轉換入手進行深入的梳理與分析。
第6章 Flink網(wǎng)絡棧
首先介紹Flink的內存管理機制,然后講解什么是Flink網(wǎng)絡棧以及網(wǎng)絡傳輸流程,其中涵蓋Flink的兩種背壓實現(xiàn)方式,后介紹流批一體的shuffle架構的設計和實現(xiàn)。
第7章 Flink Connector的設計與實現(xiàn)
首先以Kafka Connector為切入點介紹Connector模塊設計時需要考慮的消費、分區(qū)管理、一致性語義保障等關鍵問題,然后以HBase為例介紹SQL/Table Connector的使用和實現(xiàn)原理。
第8章 部署模式
主要介紹Flink中常用的三種部署模式:Local模式、Standalone模式和第三方部署模式。首先介紹用于本地調試的Local模式、Standalone模式中Session模式的構建與實現(xiàn),然后介紹Flink on YARN的Session模式和Per-Job模式的設計與實現(xiàn),后介紹Flink on Kubernetes基于YAML的實現(xiàn)。
第9章 Flink Table與SQL
主要介紹Flink Table與SQL中StreamTableEnvironment的實現(xiàn)過程、SQL的解析過程、Table Connector以及UDF和內置算子的實現(xiàn)。
第10章 Flink CEP原理解析
主要介紹Flink CEP的基本概念和語法,如何使用Flink CEP編寫作業(yè),以及 Flink CEP內部基于NFA的實現(xiàn)原理。
第11章 Flink監(jiān)控
主要介紹Flink監(jiān)控指標、常用系統(tǒng)指標和監(jiān)控體系的建設,以及常用的定位手段。
勘誤與支持
由于作者的水平有限,加之寫作時間倉促,書中難免存在不妥之處。為此,我們在GitHub上創(chuàng)建了本書專屬工程(https://github.com/streaming-olap/deep-in-flink-book)來支持在線反饋。大家如有任何意見或建議,歡迎在該工程下創(chuàng)建issue,我們會
作者簡介
羅江宇
Flink技術專家,先后就職于新浪微博、滴滴和某大型電商公司。先后主導或參與了多家公司的Flink實時計算服務的構建、對超大規(guī)模集群的維護以及Flink引擎的改造。擁有豐富的實時計算實戰(zhàn)經(jīng)驗,目前專注于Kubernetes調度、Flink SQL及Flink流批一體化方向。
趙士杰
資深大數(shù)據(jù)技術專家,曾就職于滴滴、阿里巴巴等一線互聯(lián)網(wǎng)公司。從0到1深度參與了滴滴的大數(shù)據(jù)建設,擁有非常豐富的大數(shù)據(jù)平臺一線建設經(jīng)驗,對于大數(shù)據(jù)領域的計算和存儲引擎也有深入研究。
李涵淼
大數(shù)據(jù)研發(fā)專家,曾任滴滴大數(shù)據(jù)開發(fā)工程師。從事大數(shù)據(jù)領域工作多年,參與過多家公司流計算平臺的設計與研發(fā),目前專注于批流一體、OLAP技術方向的研究與應用。
閔文俊
螞蟻集團技術專家、開源大數(shù)據(jù)社區(qū)愛好者、Flink Contributor,在實時計算領域工作多年,深度參與了滴滴、螞蟻集團的實時計算平臺建設。
前 言
第1章 閱讀Flink源代碼前的準備 1
1.1 環(huán)境準備 1
1.2 獲取、編譯和調試Flink的源代碼 4
1.2.1 獲取與導入Flink源代碼 4
1.2.2 編譯與調試Flink源代碼 6
1.3 Flink源代碼的目錄結構 9
1.4 Flink設計理念與基本架構 11
1.4.1 Flink與主流計算引擎對比 11
1.4.2 Flink基本架構 14
1.5 本章小結 17
第2章 編程模型與API 18
2.1 DataStream 18
2.2 算子 21
2.3 窗口 28
2.3.1 窗口的基本概念 28
2.3.2 窗口的執(zhí)行流程 30
2.3.3 窗口分配器 32
2.3.4 觸發(fā)器 37
2.3.5 窗口函數(shù) 41
2.4 本章小結 43
第3章 運行時組件與通信 44
3.1 運行時組件 44
3.1.1 REST 45
3.1.2 Dispatcher 54
3.1.3 ResourceManager 61
3.1.4 JobMaster 75
3.1.5 TaskExecutor 85
3.2 組件間通信 95
3.2.1 Akka與Actor模型 95
3.2.2 組件間通信實現(xiàn) 99
3.3 運行時組件的高可用 117
3.3.1 Master節(jié)點上組件的高可用 117
3.3.2 現(xiàn)有運行時組件高可用存在的問題及其解決方案 126
3.4 本章小結 128
第4章 狀態(tài)管理與容錯 129
4.1 狀態(tài) 129
4.1.1 狀態(tài)的原理與實現(xiàn) 129
4.1.2 狀態(tài)生存時間的原理與實現(xiàn) 134
4.2 檢查點 137
4.2.1 檢查點機制原理 137
4.2.2 檢查點執(zhí)行過程 137
4.2.3 任務容錯 140
4.3 狀態(tài)后端 143
4.4 本章小結 148
第5章 任務提交與執(zhí)行 149
5.1 任務提交整體流程 149
5.2 DAG轉換 152
5.2.1 DAG的4層轉換 152
5.2.2 WordCount轉換過程 152
5.3 Slot分配 160
5.3.1 相關概念和實現(xiàn)類 160
5.3.2 Slot申請流程 162
5.3.3 任務部署 168
5.4 任務執(zhí)行機制 170
5.4.1 任務執(zhí)行過程 170
5.4.2 MailBox線程模型 174
5.5 本章小結 177
第6章 Flink網(wǎng)絡棧 178
6.1 內存管理 178
6.2 網(wǎng)絡傳輸 182
6.2.1 什么是Flink網(wǎng)絡棧 182
6.2.2 非流控模型的網(wǎng)絡傳輸流程 184
6.2.3 流控模型的網(wǎng)絡傳輸流程 197
6.3 流批一體的shuffle架構 199
6.3.1 生命周期管理 199
6.3.2 數(shù)據(jù)shuffle 207
6.4 本章小結 208
第7章 Flink Connector的設計與實現(xiàn) 209
7.1 Kafka Connector實現(xiàn)原理 209
7.1.1 Kafka Source Connector實現(xiàn) 209
7.1.2 Kafka Sink Connector 實現(xiàn) 216
7.2 HBase Table Connector 實現(xiàn)原理 220
7.2.1 HBase Source Connector和Sink Connector的工廠實現(xiàn) 221
7.2.2 HBase維表實現(xiàn) 222
7.3 本章小結 224
第8章 部署模式 225
8.1 Local部署 225
8.2 Standalone部署 228
8.3 Flink on YARN模式 240
8.3.1 YARN基本架構 240
8.3.2 Flink on YARN模式介紹 241
8.3.3 Flink on YARN啟動過程 243
8.4 Flinkon Kubernetes模式 260
8.5 本章小結 265
第9章 Flink Table與SQL 266
9.1 StreamTableEnvironment類介紹 266
9.1.1 StreamExecution-Environment類 267
9.1.2 EnvironmentSettings類 267
9.1.3 TableConfig類 268
9.1.4 StreamTableEnvironment的創(chuàng)建過程 269
9.2 SQL解析過程 270
9.2.1 SQL解析 270
9.2.2 SQL優(yōu)化 277
9.2.3 RelNode轉換 279
9.3 Table Connector 281
9.3.1 TableSource 282
9.3.2 TableSink 286
9.3.3 SPI機制在Table Connector中的應用 288
9.4 UDF與內置算子 292
9.4.1 UDF 292
9.4.2 內置算子 294
9.5 本章小結 297
第10章 Flink CEP 原理解析 298
10.1 CEP的基本概念 298
10.1.1 什么是Flink CEP 298
10.1.2 Pattern 298
10.1.3 量詞 300
10.1.4 條件 301
10.1.5 連接 302
10.1.6 Flink CEP作業(yè)編寫舉例 302
10.2 CEP內部實現(xiàn)原理 304
10.2.1 NFA簡介 305
10.2.2 匹配過程 305
10.2.3 CEP狀態(tài)存儲 310
10.2.4 CEP和SQL結合 313
10.3 本章小結 315
第11章 Flink監(jiān)控 316
11.1 監(jiān)控指標 316
11.1.1 指標類型 316
11.1.2 系統(tǒng)指標及自定義指標 318
11.1.3 指標的使用 319
11.2 常用系統(tǒng)指標 322
11.3 監(jiān)控體系建設 324
11.3.1 指標監(jiān)控及展示 324
11.3.2 日志分析處理 326
11.3.3 定位手段 326
11.4 本章小結 327