本書針對Flink 1.11版本和Alink 1.2版本,采用“知識點+實例”的形式編寫,包括47個基于知識點的實例和1個綜合項目實例。第1章對大數(shù)據(jù)和人工智能進(jìn)行初步介紹;第2章用一個實例總覽Flink的關(guān)鍵知識點;第3~5章介紹Flink的架構(gòu)、開發(fā)基礎(chǔ)和轉(zhuǎn)換算子;第6、7、10、11章深入講解4種開發(fā)Flink應(yīng)用程序的API;第8、9章講解操作Flink狀態(tài)(計算和容錯)的狀態(tài)處理器API和用于處理復(fù)雜事件(異常檢測、反欺詐、風(fēng)險控制)的CEP庫;第12章講解Flink如何與其他外部系統(tǒng)集成,并實現(xiàn)Flink與Kafka的集成;第13章介紹機器學(xué)習(xí)的基礎(chǔ)知識;第14章講解機器學(xué)習(xí)框架Alink的知識和實戰(zhàn)應(yīng)用;第15章是項目實戰(zhàn),使用大數(shù)據(jù)和機器學(xué)習(xí)技術(shù)實現(xiàn)一個廣告推薦系統(tǒng)(包含離線訓(xùn)練、在線訓(xùn)練、實時預(yù)測和在線服務(wù))。本書可以作為具備Java基礎(chǔ)的開發(fā)人員、大數(shù)據(jù)領(lǐng)域從業(yè)人員的參考用書。另外,閱讀本書的讀者不需要具備高等數(shù)學(xué)知識和人工智能的底層算法知識。
12年來一直在某一線互聯(lián)網(wǎng)公司擔(dān)任資深系統(tǒng)分析師。目前帶領(lǐng)3個研發(fā)團隊,承擔(dān)系統(tǒng)的分析、設(shè)計、實施、演進(jìn)以及技術(shù)團隊管理和培訓(xùn)等職責(zé)!禨pring Boot實戰(zhàn)派》《Spring Cloud微服務(wù)架構(gòu)實戰(zhàn)派》作者
入門篇
第1章 進(jìn)入大數(shù)據(jù)和人工智能世界 2
1.1 認(rèn)識大數(shù)據(jù)和人工智能 2
1.2 認(rèn)識Flink 4
1.2.1 Flink是什么 4
1.2.2 Flink的發(fā)展歷程 4
1.2.3 Flink的應(yīng)用場景 6
1.3 認(rèn)識Alink 6
1.4 如何使用本書的源碼 6
-
第2章 【實例1】使用Flink的4種API處理無界數(shù)據(jù)流和有界數(shù)據(jù)流 8
2.1 創(chuàng)建Flink應(yīng)用程序 8
2.2 使用DataSet API處理有界數(shù)據(jù)流 10
2.2.1 編寫批處理代碼 10
2.2.2 配置依賴作用域 11
2.2.3 測試Flink應(yīng)用程序 12
2.3 使用DataStream API處理無界數(shù)據(jù)流 12
2.3.1 自定義無界數(shù)據(jù)流數(shù)據(jù)源 12
2.3.2 編寫無界數(shù)據(jù)流處理代碼 13
2.3.3 使用DataStream API的窗口功能處理無界數(shù)據(jù)流 14
2.4 使用Table API處理無界數(shù)據(jù)流和有界數(shù)據(jù)流 16
2.4.1 處理無界數(shù)據(jù)流 16
2.4.2 處理有界數(shù)據(jù)流 17
2.5 使用SQL處理無界數(shù)據(jù)流和有界數(shù)據(jù)流 19
2.5.1 處理無界數(shù)據(jù)流 19
2.5.2 處理有界數(shù)據(jù)流 19
2.6 生成執(zhí)行計劃圖 20
-
基礎(chǔ)篇
第3章 概覽Flink 24
3.1 了解流處理和批處理 24
3.1.1 數(shù)據(jù)流 24
3.1.2 流處理 25
3.1.3 流式的批處理 26
3.1.4 有狀態(tài)流處理 27
3.1.5 并行數(shù)據(jù)流 28
3.2 Flink的整體架構(gòu) 29
3.2.1 部署層 30
3.2.2 執(zhí)行引擎層 30
3.2.3 核心API層 30
3.2.4 領(lǐng)域庫層 30
3.3 Flink的編程接口 31
3.3.1 有狀態(tài)實時流處理接口 31
3.3.2 核心API(DataStream API/DataSet API) 32
3.3.3 Table API和SQL 33
3.3.4 比較DataStream API、DataSet API、Table API和SQL 34
3.4 Flink的項目依賴 34
3.4.1 Flink核心依賴和用戶的應(yīng)用程序依賴 35
3.4.2 流處理應(yīng)用程序和批處理應(yīng)用程序所需的依賴 35
3.4.3 Table API和SQL的依賴 36
3.4.4 Connector和Library的依賴 38
3.4.5 Hadoop的依賴 38
3.5 了解分布式執(zhí)行引擎的環(huán)境 38
3.5.1 作業(yè)管理器、任務(wù)管理器、客戶端 38
3.5.2 任務(wù)插槽和資源 40
3.5.3 Flink應(yīng)用程序的執(zhí)行 41
-
第4章 Flink開發(fā)基礎(chǔ) 43
4.1 開發(fā)Flink應(yīng)用程序的流程 43
4.1.1 了解Flink應(yīng)用程序的結(jié)構(gòu) 43
4.1.2 配置執(zhí)行環(huán)境和參數(shù) 44
4.1.3 初始化數(shù)據(jù)源 46
4.1.4 數(shù)據(jù)轉(zhuǎn)換 46
4.1.5 輸出結(jié)果和觸發(fā)程序 47
4.2 處理參數(shù) 49
4.2.1 將參數(shù)傳遞給函數(shù) 49
4.2.2 用參數(shù)工具讀取參數(shù) 50
4.2.3 在Flink應(yīng)用程序中使用參數(shù) 51
4.2.4 【實例2】通過withParameters()方法傳遞和使用參數(shù) 53
4.2.5 【實例3】通過參數(shù)工具讀取和使用參數(shù) 54
4.3 自定義函數(shù) 56
4.3.1 自定義函數(shù)的常用方式 56
4.3.2 了解累加器和計數(shù)器 57
4.3.3 【實例4】實現(xiàn)累加器 58
4.4 數(shù)據(jù)類型和序列化 59
4.4.1 認(rèn)識數(shù)據(jù)類型 59
4.4.2 類型擦除和類型推斷 62
4.4.3 【實例5】在Flink中使用元組類 63
4.4.4 【實例6】在Flink中使用Java的POJO類 63
4.4.5 處理類型 65
4.4.6 認(rèn)識TypeInformation類 65
4.4.7 認(rèn)識Java API類型信息 66
-
第5章 Flink的轉(zhuǎn)換算子 69
5.1 定義鍵 69
5.1.1 定義元組的鍵 69
5.1.2 使用字段表達(dá)式定義鍵 70
5.1.3 使用鍵選擇器函數(shù)定義鍵 71
5.2 Flink的通用轉(zhuǎn)換算子 71
5.2.1 DataStream和DataSet的通用轉(zhuǎn)換算子 71
5.2.2 【實例7】使用Map算子轉(zhuǎn)換數(shù)據(jù) 72
5.2.3 【實例8】使用FlatMap算子拆分句子 73
5.2.4 【實例9】使用Filter算子過濾數(shù)據(jù) 74
5.2.5 【實例10】使用Project算子投射字段并排序 75
5.3 Flink的DataSet API專用轉(zhuǎn)換算子 76
5.3.1 聚合轉(zhuǎn)換算子 76
5.3.2 分區(qū)轉(zhuǎn)換算子 78
5.3.3 排序轉(zhuǎn)換算子 79
5.3.4 關(guān)聯(lián)轉(zhuǎn)換算子 80
5.3.5 【實例11】在按字段位置鍵分組的數(shù)據(jù)集上進(jìn)行聚合轉(zhuǎn)換 81
5.3.6 【實例12】在分組元組上進(jìn)行比較運算 82
5.3.7 【實例13】使用MapPartition算子統(tǒng)計數(shù)據(jù)集的分區(qū)計數(shù) 83
5.3.8 【實例14】對POJO數(shù)據(jù)集和元組進(jìn)行分組與聚合 84
5.3.9 【實例15】使用First-n算子返回數(shù)據(jù)集的前n個元素 87
5.4 Flink的DataStream API專用轉(zhuǎn)換算子 88
5.4.1 多流轉(zhuǎn)換算子 88
5.4.2 鍵控流轉(zhuǎn)換算子 89
5.4.3 窗口轉(zhuǎn)換算子 91
5.4.4 連接轉(zhuǎn)換算子 92
5.4.5 物理分區(qū)算子 95
5.4.6 其他轉(zhuǎn)換算子 96
5.4.7 【實例16】使用Union算子連接多個數(shù)據(jù)源 97
5.4.8 【實例17】使用Connect算子連接不同類型的數(shù)據(jù)源 98
5.4.9 【實例18】使用Reduce操作鍵控流 99
5.4.10 【實例19】使用Split算子和Select算子拆分?jǐn)?shù)據(jù)流,并選擇拆分后的數(shù)據(jù)流 100
5.4.11 任務(wù)、算子鏈和資源組 101
5.5 認(rèn)識低階流處理算子 103
5.5.1 ProcessFunction——在非循環(huán)流上實現(xiàn)低階運算 103
5.5.2 CoProcessFunction——在兩個輸入流上實現(xiàn)低階運算 104
5.5.3 KeyedProcessFunction——在鍵控流上實現(xiàn)低階運算 104
5.5.4 計時器和計時器服務(wù) 104
5.6 迭代運算 106
5.6.1 認(rèn)識DataSet的全量迭代運算和增量迭代運算 106
5.6.2 比較全量迭代運算和增量迭代運算 108
5.6.3 【實例20】全量迭代 108
5.6.4 【實例21】增量迭代 109
5.6.5 認(rèn)識DataStream的迭代 111
5.6.6 【實例22】實現(xiàn)DataStream的歸零迭代運算 112
-
進(jìn)階篇
第6章 使用DataSet API實現(xiàn)批處理 116
6.1 DataSet API的數(shù)據(jù)源 116
6.1.1 認(rèn)識DataSet API的數(shù)據(jù)源 116
6.1.2 配置CSV解析 117
6.1.3 【實例23】讀取和解析CSV文件 118
6.1.4 讀取壓縮文件 119
6.2 操作函數(shù)中的數(shù)據(jù)對象 121
6.2.1 禁用對象重用 121
6.2.2 啟用對象重用 122
6.3 語義注釋 122
6.3.1 轉(zhuǎn)發(fā)字段注釋 123
6.3.2 【實例24】使用函數(shù)類注釋聲明轉(zhuǎn)發(fā)字段信息 124
6.3.3 非轉(zhuǎn)發(fā)字段 125
6.3.4 【實例25】聲明非轉(zhuǎn)發(fā)字段 125
6.3.5 讀取字段信息 126
6.3.6 【實例26】聲明讀取字段信息 126
6.4 認(rèn)識分布式緩存和廣播變量 127
6.4.1 分布式緩存 127
6.4.2 廣播變量 128
-
第7章 使用DataStream API實現(xiàn)流處理 130
7.1 認(rèn)識DataStream API 130
7.1.1 DataStream API的數(shù)據(jù)源 130
7.1.2 DataStream API的數(shù)據(jù)接收器 131
7.2 窗口 132
7.2.1 認(rèn)識時間驅(qū)動和數(shù)據(jù)驅(qū)動的窗口 132
7.2.2 認(rèn)識窗口分配器 133
7.2.3 認(rèn)識鍵控窗口和非鍵控窗口 138
7.2.4 認(rèn)識窗口的生命周期 139
7.2.5 【實例27】實現(xiàn)滾動時間窗口和滑動時間窗口 140
7.2.6 【實例28】實現(xiàn)滾動計數(shù)窗口和滑動計數(shù)窗口 141
7.2.7 【實例29】實現(xiàn)會話窗口 144
7.2.8 認(rèn)識窗口函數(shù) 146
7.2.9 【實例30】使用窗口函數(shù)實現(xiàn)窗口內(nèi)的計算 148
7.2.10 觸發(fā)器 152
7.2.11 【實例31】自定義觸發(fā)器 154
7.2.12 移除器 155
7.2.13 處理遲到數(shù)據(jù) 156
7.2.14 處理窗口結(jié)果 157
7.3 認(rèn)識時間和水位線生成器 159
7.3.1 認(rèn)識時間 159
7.3.2 設(shè)置時間特征 160
7.3.3 認(rèn)識水位線 161
7.3.4 內(nèi)置水位線生成器 166
7.3.5 編寫水位線生成器 167
7.4 狀態(tài) 169
7.4.1 認(rèn)識狀態(tài) 169
7.4.2 使用算子狀態(tài) 172
7.4.3 認(rèn)識鍵控流 173
7.4.4 使用鍵控狀態(tài) 174
7.5 狀態(tài)持久化 178
7.5.1 檢查點 178
7.5.2 狀態(tài)快照 180
7.5.3 保存點 182
7.5.4 狀態(tài)后端 182
7.5.5 比較快照、檢查點、保存點和狀態(tài)后端 184
7.6 旁路輸出 184
7.6.1 認(rèn)識旁路輸出 184
7.6.2 【實例32】輸出多條旁路數(shù)據(jù)流 186
7.7 數(shù)據(jù)處理語義 187
7.7.1 認(rèn)識數(shù)據(jù)處理語義 187
7.7.2 兩階段提交 188
7.7.3 Flink“兩階段提交”的事務(wù)性寫入 189
7.8 【實例33】自定義事件時間和水位線 191
-
第8章 使用狀態(tài)處理器API——State Processor API 193
8.1 認(rèn)識狀態(tài)處理器API 193
8.2 將應(yīng)用程序狀態(tài)映射到DataSet 194
8.3 讀取狀態(tài) 194
8.3.1 讀取算子狀態(tài) 194
8.3.2 讀取鍵控狀態(tài) 196
8.4 編寫新的保存點 198
8.5 修改保存點 200
8.6 【實例34】使用狀態(tài)處理器API寫入和讀取保存點 201
-
第9章 復(fù)雜事件處理庫 204
9.1 認(rèn)識復(fù)雜事件處理庫 204
9.2 【實例35】實現(xiàn)3種模式的CEP應(yīng)用程序 205
9.2.1 實現(xiàn)單個模式的CEP應(yīng)用程序 205
9.2.2 實現(xiàn)循環(huán)模式的CEP應(yīng)用程序 206
9.2.3 實現(xiàn)組合模式的CEP應(yīng)用程序 207
9.3 認(rèn)識模式API 207
9.3.1 單個模式 207
9.3.2 組合模式 212
9.3.3 循環(huán)模式中的連續(xù)性 213
9.3.4 模式組 215
9.3.5 跳過策略 218
9.4 檢測模式 220
9.5 復(fù)雜事件處理庫中的時間 222
9.5.1 按照“事件時間”處理遲到事件 222
9.5.2 時間上下文 223
-
第10章 使用Table API實現(xiàn)流/批統(tǒng)一處理 224
10.1 Table API和SQL 224
10.1.1 認(rèn)識Table API和SQL 224
10.1.2 Table API和SQL程序的結(jié)構(gòu) 225
10.1.3 認(rèn)識Table API和SQL的環(huán)境 225
10.1.4 認(rèn)識計劃器——OldPlanner和BlinkPlanner 226
10.1.5 查詢和輸出表 230
10.2 Table API和SQL的“流”的概念 232
10.2.1 認(rèn)識動態(tài)表 232
10.2.2 在Table API和SQL中定義時間屬性 238
10.2.3 流上的連接 242
10.2.4 認(rèn)識時態(tài)表 243
10.3 Catalog 244
10.3.1 認(rèn)識Catalog 244
10.3.2 【實例36】使用Java和SQL的DDL方式創(chuàng)建Catalog、Catalog數(shù)據(jù)庫與Catalog表247
10.3.3 使用Catalog API 249
10.3.4 使用Table API和SQL Client操作Catalog 251
10.4 Table API、SQL與DataStream和DataSet API的結(jié)合 252
10.4.1 從Table API、SQL到DataStream、DataSet的架構(gòu) 252
10.4.2 使用DataStream和DataSet API創(chuàng)建視圖與表 252
10.4.3 將表轉(zhuǎn)換成DataStream或DataSet 253
10.4.4 從數(shù)據(jù)類型到Table Schema的映射 255
10.4.5 【實例37】使用Table API轉(zhuǎn)換DataSet,并應(yīng)用Group算子、Aggregate算子、Select算子和Filter算子 258
10.4.6 【實例38】使用SQL轉(zhuǎn)換DataSet,并注冊表和執(zhí)行SQL查詢 259
-
第11章 使用SQL實現(xiàn)流/批統(tǒng)一處理 261
11.1 SQL客戶端 261
11.2 SQL語句 263
11.2.1 認(rèn)識SQL語句 263
11.2.2 CREATE語句 264
11.2.3 【實例39】使用CREATE語句創(chuàng)建和查詢表 270
11.2.4 查詢語句和查詢算子 271
11.2.5 DROP語句 283
11.2.6 ALTER語句 284
11.2.7 INSERT語句 286
11.2.8 SQL hints 288
11.2.9 描述語句、解釋語句、USE語句和SHOW語句 289
11.2.10 【實例40】使用描述語句描述表的Schema 291
11.2.11 【實例41】使用解釋語句解釋SQL語句的計劃 292
11.3 變更數(shù)據(jù)獲取 293
11.3.1 了解變更數(shù)據(jù)獲取 293
11.3.2 【實例42】獲取MySQL變更數(shù)據(jù) 293
11.4 認(rèn)識流式聚合 296
11.5 【實例43】使用DDL創(chuàng)建表,并進(jìn)行流式窗口聚合 299
-
第12章 集成外部系統(tǒng) 303
12.1 認(rèn)識Flink的連接器 303
12.1.1 內(nèi)置的連接器 303
12.1.2 Table&SQL的連接器 304
12.2 異步訪問外部數(shù)據(jù) 307
12.3 外部系統(tǒng)拉取Flink數(shù)據(jù) 311
12.4 認(rèn)識Flink的Kafka連接器 311
12.4.1 認(rèn)識Kafka 311
12.4.2 Kafka連接器 314
12.4.3 Kafka消費者 314
12.4.4 Kafka生產(chǎn)者 320
12.4.5 使用Kafka時間戳和Flink事件時間 323
12.4.6 認(rèn)識Kafka連接器指標(biāo) 324
12.4.7 啟用Kerberos身份驗證 324
12.4.8 常見問題 325
12.5 【實例44】在Flink中生產(chǎn)和消費Kafka消息 325
12.5.1 添加Flink的依賴 325
12.5.2 自定義數(shù)據(jù)源 325
12.5.3 編寫消息生產(chǎn)者 326
12.5.4 編寫消息消費者 327
12.5.5 測試在Flink中生產(chǎn)和消費Kafka消息 327
-
機器學(xué)習(xí)篇
第13章 進(jìn)入機器學(xué)習(xí)世界 330
13.1 學(xué)習(xí)人工智能的經(jīng)驗 330
13.2 認(rèn)識機器學(xué)習(xí) 331
13.3 機器學(xué)習(xí)的主要任務(wù) 332
13.3.1 分類 332
13.3.2 回歸 333
13.3.3 聚類 333
13.4 開發(fā)機器學(xué)習(xí)應(yīng)用程序的基礎(chǔ) 333
13.4.1 機器學(xué)習(xí)的概念 333
13.4.2 開發(fā)機器學(xué)習(xí)應(yīng)用程序的步驟 334
13.5 機器學(xué)習(xí)的分類 336
13.5.1 監(jiān)督式學(xué)習(xí) 336
13.5.2 無監(jiān)督式學(xué)習(xí) 336
13.5.3 半監(jiān)督式學(xué)習(xí) 336
13.5.4 增強學(xué)習(xí) 336
13.6 了解機器學(xué)習(xí)算法 337
13.7 機器學(xué)習(xí)的評估模型 339
13.7.1 認(rèn)識評估模型 339
13.7.2 認(rèn)識二分類評估 339
13.7.3 認(rèn)識多分類評估、聚類評估和回歸評估 342
-
第14章 流/批統(tǒng)一的機器學(xué)習(xí)框架(平臺)Alink 343
14.1 認(rèn)識Alink的概念和算法庫 343
14.1.1 認(rèn)識Flink ML 343
14.1.2 Alink的架構(gòu) 343
14.1.3 Alink機器學(xué)習(xí)的過程 344
14.1.4 Alink的概念 344
14.1.5 Alink的算法庫 345
14.2 【實例45】以流/批方式讀取、取樣和輸出數(shù)據(jù)集 346
14.2.1 創(chuàng)建Alink應(yīng)用程序 346
14.2.2 按行讀取、拆分和輸出數(shù)據(jù)集 348
14.2.3 讀取、取樣和輸出Libsvm格式的數(shù)據(jù)集 349
14.2.4 讀取、取樣CSV格式的數(shù)據(jù)集 350
14.2.5 讀取、解析和輸出Kafka的數(shù)據(jù)集 351
14.3 【實例46】使用分類算法實現(xiàn)數(shù)據(jù)的情感分析 353
14.3.1 認(rèn)識邏輯回歸算法 353
14.3.2 讀取數(shù)據(jù)并設(shè)置管道 354
14.3.3 訓(xùn)練模型和預(yù)測 355
14.3.4 保存、查看和復(fù)用模型 356
14.4 【實例47】實現(xiàn)協(xié)同過濾式的推薦系統(tǒng) 357
14.4.1 了解訓(xùn)練集 357
14.4.2 實現(xiàn)機器學(xué)習(xí)應(yīng)用程序 357
14.4.3 測試推薦系統(tǒng) 359
-
項目實戰(zhàn)篇
第15章 【實例48】使用大數(shù)據(jù)和機器學(xué)習(xí)技術(shù)實現(xiàn)一個廣告推薦系統(tǒng) 362
15.1 了解【實例架構(gòu) 362
15.1.2 【實例架構(gòu) 362
15.1.2 廣告推薦流程 363
15.1.3 機器學(xué)習(xí)流程 364
15.2 了解推薦系統(tǒng) 364
15.2.1 什么是推薦系統(tǒng) 364
15.2.2 推薦系統(tǒng)的分類 365
15.2.3 推薦系統(tǒng)的排序算法 366
15.2.4 召回算法 367
15.3 認(rèn)識在線學(xué)習(xí)算法 367
15.3.1 離線訓(xùn)練和在線訓(xùn)練 367
15.3.2 在線學(xué)習(xí)算法FTRL 368
15.4 實現(xiàn)機器學(xué)習(xí) 369
15.4.1 處理數(shù)據(jù) 369
15.4.2 特征工程 370
15.4.3 離線模型訓(xùn)練 371
15.4.4 在線模型訓(xùn)練 371
15.4.5 在線預(yù)測 372
15.4.6 在線評估 372
15.5 實現(xiàn)接入服務(wù)層 374
15.5.1 了解接入服務(wù)層 374
15.5.2 在Alink中發(fā)送預(yù)測數(shù)據(jù) 374
15.5.3 實現(xiàn)廣告服務(wù)器接收預(yù)測數(shù)據(jù) 375
15.6 日志打點和監(jiān)測 376
-
附 錄 377
難懂概念介紹 377
Flink常見問題匯總 378
Alink常見問題匯總 381