Flink設(shè)計(jì)與實(shí)現(xiàn):核心原理與源碼解析
定 價(jià):129 元
叢書(shū)名:大數(shù)據(jù)技術(shù)叢書(shū)
- 作者:張利兵
- 出版時(shí)間:2021/8/1
- ISBN:9787111687832
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP274
- 頁(yè)碼:
- 紙張:膠版紙
- 版次:
- 開(kāi)本:16開(kāi)
內(nèi)容簡(jiǎn)介
這是一本從源代碼角度剖析Flink設(shè)計(jì)思想、架構(gòu)原理以及各功能模塊的底層實(shí)現(xiàn)原理的著作。
作者是Flink領(lǐng)域的資深技術(shù)專家和架構(gòu)師,對(duì)Flink的源代碼進(jìn)行了深入分析和解讀,同時(shí)融入了自己豐富的工程實(shí)踐經(jīng)驗(yàn),既能讓理解Flink的設(shè)計(jì)與實(shí)現(xiàn)原理,又能為他們解決性能優(yōu)化等實(shí)際應(yīng)用問(wèn)題提供源碼級(jí)別的指導(dǎo)。源碼大多艱澀難懂,為了降低讀者的學(xué)習(xí)門檻,本書(shū)提供了大量架構(gòu)設(shè)計(jì)圖、UML圖和代碼注釋。
通過(guò)閱讀本書(shū),你將:
?徹底掌握Flink源碼設(shè)計(jì)與實(shí)現(xiàn)
?深度掌握Flink作業(yè)運(yùn)行流程
?深入了解Flink部署模式實(shí)現(xiàn)原理
?深度掌握Flink Runtime設(shè)計(jì)和實(shí)現(xiàn)原理
?庖丁解牛Flink網(wǎng)絡(luò)通信原理
?探索Flink內(nèi)存管理實(shí)現(xiàn)
?深入了解Flink接口設(shè)計(jì)
?從Flink源碼中學(xué)習(xí)架構(gòu)設(shè)計(jì)經(jīng)驗(yàn)
(1)作者資深:Apache Flink源碼貢獻(xiàn)者,多年Flink開(kāi)發(fā)經(jīng)驗(yàn),第四范式AI數(shù)據(jù)平臺(tái)架構(gòu)師。(2)深入原理:從源代碼角度剖析Flink設(shè)計(jì)思想、架構(gòu)原理以及各功能模塊的底層實(shí)現(xiàn)原理。(3)化繁為簡(jiǎn):用大量架構(gòu)設(shè)計(jì)圖、UML圖和代碼注釋降低讀者閱讀和理解Flink源代碼的門檻。(4)專家好評(píng):前騰訊、360、趣頭條、明源云等企業(yè)的大數(shù)據(jù)專家一致好評(píng)和推薦。
為什么要寫(xiě)本書(shū)
流計(jì)算從出現(xiàn)到普及,經(jīng)歷了非常多的變化從早期Apache Storm等技術(shù)的落地和使用,到現(xiàn)在越來(lái)越多的公司選擇使用Apache Flink作為流處理核心技術(shù)。Flink以其強(qiáng)大的批流一體處理能力以及低延遲、高吞吐等特性,正在吸引著越來(lái)越多的公司和用戶加入Flink社區(qū)。和大多數(shù)愛(ài)好Flink技術(shù)的人一樣,我也被Flink深深吸引,想要更加深入地了解Flink底層的技術(shù)組成。
我用了一年多的時(shí)間靜心研究Flink技術(shù)的底層實(shí)現(xiàn)原理,前前后后遇到過(guò)很多困難。單純地閱讀源碼是一件比較乏味且需要毅力的事,需要花費(fèi)非常多的時(shí)間和精力,一點(diǎn)點(diǎn)地研究框架中每個(gè)模塊的源碼實(shí)現(xiàn)以及每個(gè)方法的意義、它們之間的調(diào)用關(guān)系等。雖然過(guò)程很枯燥,但是在我將整個(gè)Flink框架梳理清楚之后,不禁為Flink框架的內(nèi)部實(shí)現(xiàn)所折服每個(gè)代碼細(xì)節(jié)都體現(xiàn)了開(kāi)發(fā)人員的專業(yè)的實(shí)現(xiàn)思想,整個(gè)框架背后包含了非常多的思想結(jié)晶。學(xué)習(xí)源碼不僅提升了我的技術(shù)功底,還加深了我對(duì)技術(shù)的理解。要想深度掌握一項(xiàng)技術(shù),可以說(shuō)沒(méi)有什么方法比閱讀源碼更加有效了。通常情況下,閱讀源碼有較高的技術(shù)門檻,不易下手,我們需要對(duì)技術(shù)有一定的理解和認(rèn)識(shí),至少能夠非常熟練地將其應(yīng)用在實(shí)際工作之中,才能更好地了解其底層運(yùn)行原理。否則在不了解框架使用的情況下貿(mào)然學(xué)習(xí)源碼實(shí)現(xiàn),非常容易陷入混亂和迷惑的狀態(tài),從而極大地影響學(xué)習(xí)體驗(yàn)。
結(jié)合以上學(xué)習(xí)經(jīng)驗(yàn),我希望能夠?qū)懸槐緦link源碼講透的書(shū),幫助那些想深入理解源碼、深度掌握Flink底層核心技術(shù)實(shí)現(xiàn)但沒(méi)有太多時(shí)間進(jìn)行研究的讀者。本書(shū)可以幫助讀者更加游刃有余地將Flink這項(xiàng)技術(shù)應(yīng)用到實(shí)際工作中。我相信,面對(duì)再難的事情,只要我們腳踏實(shí)地,循序漸進(jìn),終一定會(huì)有所領(lǐng)悟,即便達(dá)不到非常專業(yè)和精進(jìn),也至少比初學(xué)有更多的收獲。
讀者對(duì)象
本書(shū)將從多個(gè)方面介紹Flink原理實(shí)現(xiàn)與源碼,包括Flink各類編程接口的設(shè)計(jì)和實(shí)現(xiàn)以及集群運(yùn)行時(shí)等內(nèi)部原理。本書(shū)適合以下讀者閱讀。
大數(shù)據(jù)架構(gòu)師、大數(shù)據(jù)開(kāi)發(fā)工程師
Flink流計(jì)算開(kāi)發(fā)工程師
數(shù)據(jù)挖掘工程師
如何閱讀本書(shū)
全書(shū)共8章:第1章介紹Flink設(shè)計(jì)理念與基本架構(gòu);第2章介紹DataStream的設(shè)計(jì)與實(shí)現(xiàn);第3章介紹運(yùn)行時(shí)的核心原理與實(shí)現(xiàn),包括Dispatcher、ResourceManager以及JobManager等核心組件的源碼級(jí)解析和介紹;第4章介紹Flink任務(wù)提交與執(zhí)行的整體流程,包括客戶端實(shí)現(xiàn)、運(yùn)行時(shí)作業(yè)執(zhí)行過(guò)程、JobGraph及ExecutionGraph圖轉(zhuǎn)換等;第5章介紹不同的集群部署模式,包括On Yarn、On Kubernetes等;第6章介紹狀態(tài)管理與容錯(cuò),包括不同類型狀態(tài)后端的設(shè)計(jì)與實(shí)現(xiàn);第7章介紹Flink網(wǎng)絡(luò)通信,包括RPC通信以及基于Netty實(shí)現(xiàn)的網(wǎng)絡(luò)棧;第8章介紹Flink內(nèi)存管理,包括MemorySegment的設(shè)計(jì)與實(shí)現(xiàn)等。
勘誤和支持
由于作者的水平有限,書(shū)中難免會(huì)出現(xiàn)一些錯(cuò)誤或者不準(zhǔn)確的地方,懇請(qǐng)讀者批評(píng)指正。Flink技術(shù)本身比較新,且處于快速發(fā)展階段,很多新的概念我難免會(huì)有疏漏。如果你有任何意見(jiàn),可以通過(guò)電子郵箱zlb1028@126.com聯(lián)系我。期待你的反饋。
致謝
在寫(xiě)作本書(shū)的過(guò)程中,我得到很多朋友及同事的幫助和支持,尤其是李蒲生的大力支持,在此表示衷心感謝!
非常感謝我的妻子,因?yàn)橛兴闹С郑也拍軋?jiān)持將這本書(shū)寫(xiě)完。在創(chuàng)作期間,我們還有了孩子,這讓我更加有動(dòng)力完成自己的創(chuàng)作,也將這本書(shū)獻(xiàn)給我們剛出生的小禾元。
感謝機(jī)械工業(yè)出版社華章公司的編輯楊福川老師和韓蕊老師在這一年多的時(shí)間中始終支持我的寫(xiě)作,他們的鼓勵(lì)和幫助引導(dǎo)我順利完成全部書(shū)稿。
謹(jǐn)以此書(shū)獻(xiàn)給我親愛(ài)的家人以及眾多熱愛(ài)Flink的朋友們!
作者簡(jiǎn)介
張利兵
資深架構(gòu)師,流式計(jì)算領(lǐng)域?qū)<,第四范式華東區(qū)AI項(xiàng)目架構(gòu)師,原明略數(shù)據(jù)華東區(qū)大數(shù)據(jù)架構(gòu)師。
有多年大數(shù)據(jù)、流式計(jì)算方面的開(kāi)發(fā)經(jīng)驗(yàn),對(duì)Hadoop、Spark、Flink等大數(shù)據(jù)計(jì)算引擎有著非常深入的理解,積累了豐富的項(xiàng)目實(shí)踐經(jīng)驗(yàn)。先后利用相關(guān)技術(shù)為銀行、證券、地鐵等領(lǐng)域的頭部企業(yè)構(gòu)建了內(nèi)部大數(shù)據(jù)平臺(tái),參與了基于Flink的實(shí)時(shí)反欺詐風(fēng)控、實(shí)時(shí)地鐵故障預(yù)警等流式計(jì)算平臺(tái)的設(shè)計(jì)和研發(fā)。
前 言
第1章 Flink設(shè)計(jì)理念與基本架構(gòu) 1
1.1 Flink基本設(shè)計(jì)思想 1
1.1.1 Stratosphere系統(tǒng)架構(gòu) 1
1.1.2 DataFlow模型的設(shè)計(jì)思想 3
1.1.3 分布式異步快照算法 6
1.2 Flink整體架構(gòu) 9
1.2.1 架構(gòu)介紹 9
1.2.2 Flink集群架構(gòu) 11
1.2.3 核心概念 12
1.3 Flink源碼分析與編譯 14
1.3.1 源碼編譯 14
1.3.2 源碼調(diào)試環(huán)境搭建 15
1.4 本章小結(jié) 19
第2章 DataStream的設(shè)計(jì)與實(shí)現(xiàn) 20
2.1 DataStream API的主要組成 20
2.1.1 DataStream API應(yīng)用實(shí)例 20
2.1.2 Transformation詳解 23
2.2 StreamOperator的定義與實(shí)現(xiàn) 25
2.2.1 StreamOperator接口實(shí)現(xiàn) 26
2.2.2 OneInputStreamOperator與TwoInputStreamOperator 31
2.2.3 StreamOperatorFactory詳解 33
2.3 Function的定義與實(shí)現(xiàn) 35
2.3.1 RichFunction詳解 36
2.3.2 SourceFunction與SinkFunction 38
2.3.3 ProcessFunction的定義與實(shí)現(xiàn) 44
2.4 TimerService的設(shè)計(jì)與實(shí)現(xiàn) 47
2.4.1 時(shí)間概念與Watermark 47
2.4.2 TimerService時(shí)間服務(wù) 53
2.5 DataStream核心轉(zhuǎn)換 59
2.5.1 KeyedStream與物理分區(qū) 59
2.5.2 WindowedStream的設(shè)計(jì)與實(shí)現(xiàn) 62
2.6 本章小結(jié) 68
第3章 運(yùn)行時(shí)的核心原理與實(shí)現(xiàn) 69
3.1 運(yùn)行時(shí)的整體架構(gòu) 69
3.1.1 運(yùn)行時(shí)整體架構(gòu)概覽 69
3.1.2 集群的啟動(dòng)與初始化 72
3.2 運(yùn)行時(shí)組件的創(chuàng)建和啟動(dòng) 79
3.2.1 集群組件的創(chuàng)建和啟動(dòng) 79
3.2.2 WebMonitorEndpoint的創(chuàng)建與初始化 85
3.2.3 Dispatcher的創(chuàng)建與初始化 91
3.2.4 ResourceManager的創(chuàng)建與初始化 98
3.2.5 TaskManager的創(chuàng)建與啟動(dòng) 106
3.3 集群資源管理 115
3.3.1 ResourceManager詳解 116
3.3.2 ResourceManagerGateway接口實(shí)現(xiàn) 118
3.3.3 Slot計(jì)算資源管理 119
3.4 系統(tǒng)高可用與容錯(cuò) 130
3.4.1 HighAvailabilityServices的設(shè)計(jì)與實(shí)現(xiàn) 130
3.4.2 基于ZooKeeper實(shí)現(xiàn)高可用 135
3.4.3 JobGraphStore的設(shè)計(jì)與實(shí)現(xiàn) 141
3.5 本章小結(jié) 144
第4章 任務(wù)提交與執(zhí)行 145
4.1 客戶端作業(yè)提交 145
4.1.1 命令行提交 145
4.1.2 創(chuàng)建和初始化CLIFrontend 148
4.1.3 PackagedProgram構(gòu)造 150
4.2 ExecutionEnvironment初始化 152
4.2.1 ExecutionEnvironment類型 152
4.2.2 StreamExecutionEnvironment詳解 154
4.3 將Pipeline轉(zhuǎn)換成JobGraph 161
4.3.1 用Transformation生成StreamGraph 162
4.3.2 將StreamGraph轉(zhuǎn)換為JobGraph 169
4.3.3 將JobGraph提交到集群運(yùn)行時(shí) 176
4.4 JobGraph的接收與運(yùn)行 178
4.4.1 JobGraph提交整體流程 178
4.4.2 Dispatcher任務(wù)與分發(fā) 180
4.4.3 JobManager啟動(dòng)與初始化 184
4.4.4 JobMaster詳解 188
4.5 ExecutionGraph的調(diào)度與執(zhí)行 195
4.5.1 ExecutionGraph生成 198
4.5.2 SchedulerNG調(diào)度器 200
4.6 Task的執(zhí)行與注銷 206
4.6.1 Task的啟動(dòng)與注銷 208
4.6.2 AbstractInvokable的加載與初始化 211
4.6.3 StreamTask詳解 212
4.6.4 StreamTask線程模型 216
4.6.5 Task重啟與容錯(cuò)策略 223
4.7 本章小結(jié) 234
第5章 集群部署模式 235
5.1 基本概念 235
5.1.1 ClusterClient的創(chuàng)建與獲取 235
5.1.2 ClusterEntrypoint集群?jiǎn)?dòng)類 241
5.2 Flink On Yarn的設(shè)計(jì)與實(shí)現(xiàn) 245
5.2.1 Yarn架構(gòu)的設(shè)計(jì)與實(shí)現(xiàn) 245
5.2.2 Session集群的部署與啟動(dòng) 247
5.2.3 YarnResourceManager詳解 253
5.3 Flink On Kubernetes的設(shè)計(jì)與實(shí)現(xiàn) 258
5.3.1 Flink On Kubernetes架構(gòu) 259
5.3.2 Session集群的部署與啟動(dòng) 261
5.3.3 KubernetesResourceManager詳解 268
5.4 本章小結(jié) 274
第6章 狀態(tài)管理與容錯(cuò) 275
6.1 狀態(tài)數(shù)據(jù)管理 275
6.1.1 狀態(tài)數(shù)據(jù)類型 275
6.1.2 狀態(tài)初始化流程 279
6.2 KeyedState的創(chuàng)建與管理 285
6.2.1 KeyedStateBackend的整體設(shè)計(jì) 285
6.2.2 HeapKeyedStateBackend的實(shí)現(xiàn) 286
6.3 OperatorState的創(chuàng)建與管理 295
6.3.1 OperatorStateBackend的整體設(shè)計(jì) 295
6.3.2 基于DefaultOperatorState-Backend創(chuàng)建OperatorState 296
6.4 StateBackend詳解 299
6.4.1 StateBackend的整體設(shè)計(jì) 299
6.4.2 MemoryStateBackend的實(shí)現(xiàn) 303
6.5 Checkpoint的設(shè)計(jì)與實(shí)現(xiàn) 308
6.5.1 Checkpoint的實(shí)現(xiàn)原理 308
6.5.2 Checkpoint的觸發(fā)過(guò)程 315
6.6 本章小結(jié) 341
第7章 網(wǎng)絡(luò)通信 342
7.1 集群RPC通信機(jī)制 342
7.1.1 Flink RPC框架的整體設(shè)計(jì) 342
7.1.2 AkkaRpcService詳解 347
7.1.3 Rp