為什么要寫這本書
記得在幾年前剛開始做流式計(jì)算相關(guān)的項(xiàng)目時(shí),發(fā)覺項(xiàng)目對(duì)實(shí)時(shí)性和數(shù)據(jù)量的要求很高,無(wú)奈求助于Flink開源社區(qū)(后文簡(jiǎn)稱社區(qū)),在社區(qū)中發(fā)現(xiàn)可以使用的流式框架有很多,例如比較主流的框架Apache Storm、Spark Streaming等,Apache Flink(簡(jiǎn)稱Flink)也在其中。于是筆者開始對(duì)各種流式框架進(jìn)行詳細(xì)研究,最后發(fā)現(xiàn)能同時(shí)支持低延遲、高吞吐、Excactly-once的框架只有Apache Flink,從那時(shí)起筆者就對(duì)Flink這套框架充滿興趣,不管是其架構(gòu)還是接口,都可以發(fā)現(xiàn)其中包含了非常優(yōu)秀的設(shè)計(jì)思想。雖然當(dāng)時(shí)Flink在社區(qū)的成熟度并不是很高,但筆者還是決定將Flink應(yīng)用在自己的項(xiàng)目中,自此開啟了Flink分布式計(jì)算技術(shù)應(yīng)用之旅。
剛開始學(xué)習(xí)Flink,對(duì)于沒有分布式處理技術(shù)和流式計(jì)算經(jīng)驗(yàn)的人來說會(huì)相對(duì)比較困難,因?yàn)槠浜茈y理解有狀態(tài)計(jì)算、數(shù)據(jù)一致性保障等概念。尤其在相關(guān)中文資源比較匱乏的情況下,需要用戶在官網(wǎng)以及國(guó)外的技術(shù)網(wǎng)站中翻閱大量的外文資料,這在一定程度上對(duì)學(xué)習(xí)和應(yīng)用Flink造成了阻礙。筆者在2018年參加了一場(chǎng)由Flink中文社區(qū)組織的線下交流活動(dòng),當(dāng)時(shí)聽了很多領(lǐng)域內(nèi)專家將Flink應(yīng)用在不同業(yè)務(wù)場(chǎng)景中的分享,發(fā)現(xiàn)Flink這項(xiàng)技術(shù)雖然優(yōu)秀,但是國(guó)內(nèi)尚未有一本能夠全面介紹Flink的中文書籍,于是筆者決定結(jié)合自己的實(shí)際項(xiàng)目經(jīng)驗(yàn)來完成一本Flink中文書籍,以幫助他人學(xué)習(xí)和使用Flink這項(xiàng)優(yōu)秀的分布式處理技術(shù)。
阿里巴巴在2018年1月開源了其內(nèi)部Flink的分支項(xiàng)目Blink,并推動(dòng)社區(qū)將Blink中優(yōu)秀的特性合并到Flink主干版本中,一時(shí)間Flink在國(guó)內(nèi)的發(fā)展被推向了高潮,成為很多公司想去嘗試使用的新技術(shù)。因此筆者相信未來會(huì)有更多的開發(fā)者參與到Flink社區(qū)中來,F(xiàn)link也將在未來的大數(shù)據(jù)生態(tài)中占據(jù)舉足輕重的位置。
讀者對(duì)象
本書從多個(gè)方面對(duì)Flink進(jìn)行了深入介紹,包括原理、多種抽象接口的使用,以及Flink的性能監(jiān)控與調(diào)優(yōu)等方面,因此本書比較適合以下類型的讀者。
流計(jì)算開發(fā)工程師
大數(shù)據(jù)架構(gòu)工程師
大數(shù)據(jù)開發(fā)工程師
數(shù)據(jù)挖掘工程師
高校研究生以及高年級(jí)本科生
如何閱讀本書
本書共分為10章,各章節(jié)間具有一定的先后關(guān)系,對(duì)于剛?cè)腴T的讀者,建議從第1章開始循序漸進(jìn)地學(xué)習(xí)。
對(duì)于有一定經(jīng)驗(yàn)的讀者可以自行選擇章節(jié)開始學(xué)習(xí)。如果想使用Flink開發(fā)流式應(yīng)用,則可以直接閱讀第4章、第5章,以及第7章之后的內(nèi)容;如果想使用Flink開發(fā)批計(jì)算應(yīng)用,則可以選擇閱讀第5章以及第7章之后的內(nèi)容。
勘誤和支持
除封面署名外,參加本書編寫工作的還有:張?jiān)賱、尚越、程龍、姚遠(yuǎn)等。由于筆者水平有限,編寫時(shí)間倉(cāng)促,書中難免會(huì)出現(xiàn)一些錯(cuò)誤或者不準(zhǔn)確的地方,懇請(qǐng)讀者批評(píng)指正。由于Flink技術(shù)的參考資料相對(duì)較少,因此書中有些地方參考了Flink官方文檔,讀者也可以結(jié)合Flink官網(wǎng)來學(xué)習(xí)。書中的全部源文件可以從GitHub網(wǎng)站下載,地址為https://github.com/zhanglibing1990/learning-flink。同時(shí)筆者也會(huì)將相應(yīng)的功能及時(shí)更新。如果你有更多寶貴的意見可以通過QQ群686656574或電子郵箱zhanglibing1990@126.com聯(lián)系筆者,期待能夠得到你們的真摯反饋。
致謝
在本書的寫作過程中,得到了很多朋友及同事的幫助和支持,在此表示衷心感謝!
感謝我的女朋友,因?yàn)橛心愕闹С,我才能?jiān)持將本書順利完成,謝謝你一直陪伴在我的身邊,不斷鼓勵(lì)我前行。
感謝機(jī)械工業(yè)出版社華章公司的編輯楊福川和張錫鵬,在這半年多的時(shí)間中始終支持我的寫作,你們的鼓勵(lì)和幫助引導(dǎo)我順利完成全部書稿。
謹(jǐn)以此書獻(xiàn)給我最親愛的家人,以及眾多熱愛Flink的朋友!
總結(jié)
本書最開始介紹Flink的發(fā)展歷史,然后對(duì)Flink批數(shù)據(jù)和流數(shù)據(jù)的不同處理接口進(jìn)行介紹,再對(duì)Flink的部署與實(shí)施、性能優(yōu)化等方面進(jìn)行全面講解。經(jīng)過系統(tǒng)完整地了解和學(xué)習(xí)Flink分布式處理技術(shù)之后,可以發(fā)現(xiàn)Flink有很多非常先進(jìn)的概念,以及非常完善的接口設(shè)計(jì),這些都能讓用戶更加有效地處理大數(shù)據(jù),特別是流式數(shù)據(jù)處理。隨著大數(shù)據(jù)技術(shù)的不斷發(fā)展,F(xiàn)link也在大數(shù)據(jù)的浪潮中奮勇前行。越來越多的用戶也參與到Flink社區(qū)的開發(fā)中,尤其是近年來隨著阿里巴巴的推進(jìn),Blink的開源在一定程度上推動(dòng)了Flink在國(guó)內(nèi)大規(guī)模的落地。相信在不久的將來,F(xiàn)link會(huì)逐漸成為國(guó)內(nèi)乃至全球不可或缺的分布式處理引擎,筆者也相信Flink在流式數(shù)據(jù)處理領(lǐng)域會(huì)有新的突破,能夠改變目前大部分基于批處理的模式,讓分布式數(shù)據(jù)處理變得更加高效,使得數(shù)據(jù)處理成本不斷降低。
張利兵
2019年
前言
第1章 Apache Flink介紹 1
1.1 Apache Flink是什么 1
1.2 數(shù)據(jù)架構(gòu)的演變 2
1.2.1 傳統(tǒng)數(shù)據(jù)基礎(chǔ)架構(gòu) 3
1.2.2 大數(shù)據(jù)數(shù)據(jù)架構(gòu) 4
1.2.3 有狀態(tài)流計(jì)算架構(gòu) 5
1.2.4 為什么會(huì)是Flink 6
1.3 Flink應(yīng)用場(chǎng)景 8
1.4 Flink基本架構(gòu) 10
1.4.1 基本組件棧 10
1.4.2 基本架構(gòu)圖 11
1.5 本章小結(jié) 13
第2章 環(huán)境準(zhǔn)備 14
2.1 運(yùn)行環(huán)境介紹 14
2.2 Flink項(xiàng)目模板 15
2.2.1 基于Java實(shí)現(xiàn)的項(xiàng)目模板 15
2.2.2 基于Scala實(shí)現(xiàn)的項(xiàng)目模板 18
2.3 Flink開發(fā)環(huán)境配置 20
2.3.1 下載IntelliJ IDEA IDE
21
2.3.2 安裝Scala Plugins
21
2.3.3 導(dǎo)入Flink應(yīng)用代碼 22
2.3.4 項(xiàng)目配置 22
2.4 運(yùn)行Scala REPL 24
2.4.1 環(huán)境支持 24
2.4.2 運(yùn)行程序 24
2.5 Flink源碼編譯 25
2.6 本章小結(jié) 26
第3章 Flink編程模型
27
3.1 數(shù)據(jù)集類型 27
3.2 Flink編程接口 29
3.3 Flink程序結(jié)構(gòu) 30
3.4 Flink數(shù)據(jù)類型 37
3.4.1 數(shù)據(jù)類型支持 37
3.4.2 TypeInformation信息獲取 40
3.5 本章小結(jié) 43
第4章 DataStream API 介紹與使用 44
4.1 DataStream編程模型 44
4.1.1 DataSources數(shù)據(jù)輸入 45
4.1.2 DataSteam轉(zhuǎn)換操作 49
4.1.3 DataSinks數(shù)據(jù)輸出 59
4.2 時(shí)間概念與Watermark 61
4.2.1 時(shí)間概念類型 61
4.2.2 EventTime和Watermark 63
4.3 Windows窗口計(jì)算 69
4.3.1 Windows Assigner
70
4.3.2 Windows Function
77
4.3.3 Trigger窗口觸發(fā)器 83
4.3.4 Evictors數(shù)據(jù)剔除器 87
4.3.5 延遲數(shù)據(jù)處理 88
4.3.6 連續(xù)窗口計(jì)算 89
4.3.7 Windows多流合并 90
4.4 作業(yè)鏈和資源組 95
4.4.1 作業(yè)鏈 95
4.4.2 Slots資源組 96
4.5 Asynchronous I/O異步操作 97
4.6 本章小結(jié) 98
第5章 Flink狀態(tài)管理和容錯(cuò)
100
5.1 有狀態(tài)計(jì)算 100
5.2 Checkpoints和Savepoints 109
5.2.1 Checkpoints檢查點(diǎn)機(jī)制 109
5.2.2 Savepoints機(jī)制 111
5.3 狀態(tài)管理器 114
5.3.1 StateBackend類別 114
5.3.2 狀態(tài)管理器配置 116
5.4 Querable State
118
5.5 本章小結(jié) 123
第6章 DataSet API介紹與使用 124
6.1 DataSet API 124
6.1.1 應(yīng)用實(shí)例 125
6.1.2 DataSources數(shù)據(jù)接入 126
6.1.3 DataSet轉(zhuǎn)換操作 128
6.1.4 DataSinks數(shù)據(jù)輸出 134
6.2 迭代計(jì)算 136
6.2.1 全量迭代 136
6.2.2 增量迭代 137
6.3 廣播變量與分布式緩存 139
6.3.1 廣播變量 139
6.3.2 分布式緩存 140
6.4 語(yǔ)義注解 141
6.4.1 Forwarded Fileds注解 141
6.4.2 Non-Forwarded Fileds注解 143
6.4.3 Read Fields注解 144
6.5 本章小結(jié) 145
第7章 Table API & SQL介紹與使用 146
7.1 TableEnviroment概念 146
7.1.1 開發(fā)環(huán)境構(gòu)建 147
7.1.2 TableEnvironment基本操作 147
7.1.3 外部連接器 155
7.1.4 時(shí)間概念 162
7.1.5 Temporal Tables臨時(shí)表 166
7.2 Flink Table API
167
7.2.1 Table API應(yīng)用實(shí)例 167
7.2.2 數(shù)據(jù)查詢和過濾 168
7.2.3 窗口操作 168
7.2.4 聚合操作 173
7.2.5 多表關(guān)聯(lián) 175
7.2.6 集合操作 177
7.2.7 排序操作 178
7.2.8 數(shù)據(jù)寫入 179
7.3 Flink SQL使用 179
7.3.1 Flink SQL實(shí)例 179
7.3.2 執(zhí)行SQL 180
7.3.3 數(shù)據(jù)查詢與過濾 181
7.3.4 Group Windows窗口操作 182
7.3.5 數(shù)據(jù)聚合 184
7.3.6 多表關(guān)聯(lián) 186
7.3.7 集合操作 187
7.3.8 數(shù)據(jù)輸出 189
7.4 自定義函數(shù) 189
7.4.1 Scalar Function
189
7.4.2 Table Function
191
7.4.3 Aggregation Function
192
7.5 自定義數(shù)據(jù)源 193
7.5.1 TableSource定義 193
7.5.2 TableSink定義 196
7.5.3 TableFactory定義 199
7.6 本章小結(jié) 201
第8章 Flink組件棧介紹與使用 202
8.1 Flink復(fù)雜事件處理 202
8.1.1 基礎(chǔ)概念 203
8.1.2 Pattern API 204
8.1.3 事件獲取 210
8.1.4 應(yīng)用實(shí)例 212
8.2 Flink Gelly圖計(jì)算應(yīng)用 213
8.2.1 基本概念 213
8.2.2 Graph API 214
8.2.3 迭代圖處理 220
8.2.4 圖生成器 226
8.3 FlinkML機(jī)器學(xué)習(xí)應(yīng)用 227
8.3.1 基本概念 227
8.3.2 有監(jiān)督學(xué)習(xí)算子 229
8.3.3 數(shù)據(jù)預(yù)處理 231
8.3.4 推薦算法 234
8.3.5 Pipelines In FlinkML
235
8.4 本章小結(jié) 236
第9章 Flink部署與應(yīng)用
237
9.1 Flink集群部署 237
9.1.1 Standalone Cluster部署 238
9.1.2 Yarn Cluster部署 240
9.1.3 Kubernetes Cluster部署 244
9.2 Flink高可用配置 247
9.2.1 Standalone集群高可用配置 248
9.2.2 Yarn Session集群高可用配置 250
9.3 Flink安全管理 251
9.3.1 認(rèn)證目標(biāo) 251
9.3.2 認(rèn)證配置 252
9.3.3 SSL配置 253
9.4 Flink集群升級(jí) 255
9.4.1 任務(wù)重啟 256
9.4.2 狀態(tài)維護(hù) 256
9.4.3 版本升級(jí) 257
9.5 本章小結(jié) 258
第10章 Flink監(jiān)控與性能優(yōu)化
259
10.1 監(jiān)控指標(biāo) 259
10.1.1 系統(tǒng)監(jiān)控指標(biāo) 259
10.1.2 監(jiān)控指標(biāo)注冊(cè) 261
10.1.3 監(jiān)控指標(biāo)報(bào)表 264
10.2 Backpressure監(jiān)控與優(yōu)化 266
10.2.1 Backpressure進(jìn)程抽樣 266
10.2.2 Backpressure頁(yè)面監(jiān)控 267
10.2.3 Backpressure配置 268
10.3 Checkpointing監(jiān)控與優(yōu)化 268
10.3.1 Checkpointing頁(yè)面監(jiān)控 268
10.3.2 Checkpointing優(yōu)化 271
10.4 Flink內(nèi)存優(yōu)化 273
10.4.1 Flink內(nèi)存配置 274
10.4.2 Network Buffers配置 275
10.5 本章小結(jié) 277