本書針對Flink 1.11版本和Alink 1.2版本,采用“知識點+實例”的形式編寫,包括47個基于知識點的實例和1個綜合項目實例。第1章對大數(shù)據(jù)和人工智能進行初步介紹;第2章用一個實例總覽Flink的關鍵知識點;第3~5章介紹Flink的架構、開發(fā)基礎和轉換算子;第6、7、10、11章深入講解4種開發(fā)Flink應用程序的API;第8、9章講解操作Flink狀態(tài)(計算和容錯)的狀態(tài)處理器API和用于處理復雜事件(異常檢測、反欺詐、風險控制)的CEP庫;第12章講解Flink如何與其他外部系統(tǒng)集成,并實現(xiàn)Flink與Kafka的集成;第13章介紹機器學習的基礎知識;第14章講解機器學習框架Alink的知識和實戰(zhàn)應用;第15章是項目實戰(zhàn),使用大數(shù)據(jù)和機器學習技術實現(xiàn)一個廣告推薦系統(tǒng)(包含離線訓練、在線訓練、實時預測和在線服務)。本書可以作為具備Java基礎的開發(fā)人員、大數(shù)據(jù)領域從業(yè)人員的參考用書。另外,閱讀本書的讀者不需要具備高等數(shù)學知識和人工智能的底層算法知識。
12年來一直在某一線互聯(lián)網(wǎng)公司擔任資深系統(tǒng)分析師。目前帶領3個研發(fā)團隊,承擔系統(tǒng)的分析、設計、實施、演進以及技術團隊管理和培訓等職責。《Spring Boot實戰(zhàn)派》《Spring Cloud微服務架構實戰(zhàn)派》作者
入門篇
第1章 進入大數(shù)據(jù)和人工智能世界 2
1.1 認識大數(shù)據(jù)和人工智能 2
1.2 認識Flink 4
1.2.1 Flink是什么 4
1.2.2 Flink的發(fā)展歷程 4
1.2.3 Flink的應用場景 6
1.3 認識Alink 6
1.4 如何使用本書的源碼 6
-
第2章 【實例1】使用Flink的4種API處理無界數(shù)據(jù)流和有界數(shù)據(jù)流 8
2.1 創(chuàng)建Flink應用程序 8
2.2 使用DataSet API處理有界數(shù)據(jù)流 10
2.2.1 編寫批處理代碼 10
2.2.2 配置依賴作用域 11
2.2.3 測試Flink應用程序 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
-
基礎篇
第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的整體架構 29
3.2.1 部署層 30
3.2.2 執(zhí)行引擎層 30
3.2.3 核心API層 30
3.2.4 領域庫層 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核心依賴和用戶的應用程序依賴 35
3.4.2 流處理應用程序和批處理應用程序所需的依賴 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è)管理器、任務管理器、客戶端 38
3.5.2 任務插槽和資源 40
3.5.3 Flink應用程序的執(zhí)行 41
-
第4章 Flink開發(fā)基礎 43
4.1 開發(fā)Flink應用程序的流程 43
4.1.1 了解Flink應用程序的結構 43
4.1.2 配置執(zhí)行環(huán)境和參數(shù) 44
4.1.3 初始化數(shù)據(jù)源 46
4.1.4 數(shù)據(jù)轉換 46
4.1.5 輸出結果和觸發(fā)程序 47
4.2 處理參數(shù) 49
4.2.1 將參數(shù)傳遞給函數(shù) 49
4.2.2 用參數(shù)工具讀取參數(shù) 50
4.2.3 在Flink應用程序中使用參數(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 認識數(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 認識TypeInformation類 65
4.4.7 認識Java API類型信息 66
-
第5章 Flink的轉換算子 69
5.1 定義鍵 69
5.1.1 定義元組的鍵 69
5.1.2 使用字段表達式定義鍵 70
5.1.3 使用鍵選擇器函數(shù)定義鍵 71
5.2 Flink的通用轉換算子 71
5.2.1 DataStream和DataSet的通用轉換算子 71
5.2.2 【實例7】使用Map算子轉換數(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專用轉換算子 76
5.3.1 聚合轉換算子 76
5.3.2 分區(qū)轉換算子 78
5.3.3 排序轉換算子 79
5.3.4 關聯(lián)轉換算子 80
5.3.5 【實例11】在按字段位置鍵分組的數(shù)據(jù)集上進行聚合轉換 81
5.3.6 【實例12】在分組元組上進行比較運算 82
5.3.7 【實例13】使用MapPartition算子統(tǒng)計數(shù)據(jù)集的分區(qū)計數(shù) 83
5.3.8 【實例14】對POJO數(shù)據(jù)集和元組進行分組與聚合 84
5.3.9 【實例15】使用First-n算子返回數(shù)據(jù)集的前n個元素 87
5.4 Flink的DataStream API專用轉換算子 88
5.4.1 多流轉換算子 88
5.4.2 鍵控流轉換算子 89
5.4.3 窗口轉換算子 91
5.4.4 連接轉換算子 92
5.4.5 物理分區(qū)算子 95
5.4.6 其他轉換算子 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算子拆分數(shù)據(jù)流,并選擇拆分后的數(shù)據(jù)流 100
5.4.11 任務、算子鏈和資源組 101
5.5 認識低階流處理算子 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 計時器和計時器服務 104
5.6 迭代運算 106
5.6.1 認識DataSet的全量迭代運算和增量迭代運算 106
5.6.2 比較全量迭代運算和增量迭代運算 108
5.6.3 【實例20】全量迭代 108
5.6.4 【實例21】增量迭代 109
5.6.5 認識DataStream的迭代 111
5.6.6 【實例22】實現(xiàn)DataStream的歸零迭代運算 112
-
進階篇
第6章 使用DataSet API實現(xiàn)批處理 116
6.1 DataSet API的數(shù)據(jù)源 116
6.1.1 認識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 轉發(fā)字段注釋 123
6.3.2 【實例24】使用函數(shù)類注釋聲明轉發(fā)字段信息 124
6.3.3 非轉發(fā)字段 125
6.3.4 【實例25】聲明非轉發(fā)字段 125
6.3.5 讀取字段信息 126
6.3.6 【實例26】聲明讀取字段信息 126
6.4 認識分布式緩存和廣播變量 127
6.4.1 分布式緩存 127
6.4.2 廣播變量 128
-
第7章 使用DataStream API實現(xiàn)流處理 130
7.1 認識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 認識時間驅動和數(shù)據(jù)驅動的窗口 132
7.2.2 認識窗口分配器 133
7.2.3 認識鍵控窗口和非鍵控窗口 138
7.2.4 認識窗口的生命周期 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 認識窗口函數(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 處理窗口結果 157
7.3 認識時間和水位線生成器 159
7.3.1 認識時間 159
7.3.2 設置時間特征 160
7.3.3 認識水位線 161
7.3.4 內(nèi)置水位線生成器 166
7.3.5 編寫水位線生成器 167
7.4 狀態(tài) 169
7.4.1 認識狀態(tài) 169
7.4.2 使用算子狀態(tài) 172
7.4.3 認識鍵控流 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 認識旁路輸出 184
7.6.2 【實例32】輸出多條旁路數(shù)據(jù)流 186
7.7 數(shù)據(jù)處理語義 187
7.7.1 認識數(shù)據(jù)處理語義 187
7.7.2 兩階段提交 188
7.7.3 Flink“兩階段提交”的事務性寫入 189
7.8 【實例33】自定義事件時間和水位線 191
-
第8章 使用狀態(tài)處理器API——State Processor API 193
8.1 認識狀態(tài)處理器API 193
8.2 將應用程序狀態(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章 復雜事件處理庫 204
9.1 認識復雜事件處理庫 204
9.2 【實例35】實現(xiàn)3種模式的CEP應用程序 205
9.2.1 實現(xiàn)單個模式的CEP應用程序 205
9.2.2 實現(xiàn)循環(huán)模式的CEP應用程序 206
9.2.3 實現(xiàn)組合模式的CEP應用程序 207
9.3 認識模式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 復雜事件處理庫中的時間 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 認識Table API和SQL 224
10.1.2 Table API和SQL程序的結構 225
10.1.3 認識Table API和SQL的環(huán)境 225
10.1.4 認識計劃器——OldPlanner和BlinkPlanner 226
10.1.5 查詢和輸出表 230
10.2 Table API和SQL的“流”的概念 232
10.2.1 認識動態(tài)表 232
10.2.2 在Table API和SQL中定義時間屬性 238
10.2.3 流上的連接 242
10.2.4 認識時態(tài)表 243
10.3 Catalog 244
10.3.1 認識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的結合 252
10.4.1 從Table API、SQL到DataStream、DataSet的架構 252
10.4.2 使用DataStream和DataSet API創(chuàng)建視圖與表 252
10.4.3 將表轉換成DataStream或DataSet 253
10.4.4 從數(shù)據(jù)類型到Table Schema的映射 255
10.4.5 【實例37】使用Table API轉換DataSet,并應用Group算子、Aggregate算子、Select算子和Filter算子 258
10.4.6 【實例38】使用SQL轉換DataSet,并注冊表和執(zhí)行SQL查詢 259
-
第11章 使用SQL實現(xiàn)流/批統(tǒng)一處理 261
11.1 SQL客戶端 261
11.2 SQL語句 263
11.2.1 認識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 認識流式聚合 296
11.5 【實例43】使用DDL創(chuàng)建表,并進行流式窗口聚合 299
-
第12章 集成外部系統(tǒng) 303
12.1 認識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 認識Flink的Kafka連接器 311
12.4.1 認識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 認識Kafka連接器指標 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
-
機器學習篇
第13章 進入機器學習世界 330
13.1 學習人工智能的經(jīng)驗 330
13.2 認識機器學習 331
13.3 機器學習的主要任務 332
13.3.1 分類 332
13.3.2 回歸 333
13.3.3 聚類 333
13.4 開發(fā)機器學習應用程序的基礎 333
13.4.1 機器學習的概念 333
13.4.2 開發(fā)機器學習應用程序的步驟 334
13.5 機器學習的分類 336
13.5.1 監(jiān)督式學習 336
13.5.2 無監(jiān)督式學習 336
13.5.3 半監(jiān)督式學習 336
13.5.4 增強學習 336
13.6 了解機器學習算法 337
13.7 機器學習的評估模型 339
13.7.1 認識評估模型 339
13.7.2 認識二分類評估 339
13.7.3 認識多分類評估、聚類評估和回歸評估 342
-
第14章 流/批統(tǒng)一的機器學習框架(平臺)Alink 343
14.1 認識Alink的概念和算法庫 343
14.1.1 認識Flink ML 343
14.1.2 Alink的架構 343
14.1.3 Alink機器學習的過程 344
14.1.4 Alink的概念 344
14.1.5 Alink的算法庫 345
14.2 【實例45】以流/批方式讀取、取樣和輸出數(shù)據(jù)集 346
14.2.1 創(chuàng)建Alink應用程序 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 認識邏輯回歸算法 353
14.3.2 讀取數(shù)據(jù)并設置管道 354
14.3.3 訓練模型和預測 355
14.3.4 保存、查看和復用模型 356
14.4 【實例47】實現(xiàn)協(xié)同過濾式的推薦系統(tǒng) 357
14.4.1 了解訓練集 357
14.4.2 實現(xiàn)機器學習應用程序 357
14.4.3 測試推薦系統(tǒng) 359
-
項目實戰(zhàn)篇
第15章 【實例48】使用大數(shù)據(jù)和機器學習技術實現(xiàn)一個廣告推薦系統(tǒng) 362
15.1 了解【實例架構 362
15.1.2 【實例架構 362
15.1.2 廣告推薦流程 363
15.1.3 機器學習流程 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 認識在線學習算法 367
15.3.1 離線訓練和在線訓練 367
15.3.2 在線學習算法FTRL 368
15.4 實現(xiàn)機器學習 369
15.4.1 處理數(shù)據(jù) 369
15.4.2 特征工程 370
15.4.3 離線模型訓練 371
15.4.4 在線模型訓練 371
15.4.5 在線預測 372
15.4.6 在線評估 372
15.5 實現(xiàn)接入服務層 374
15.5.1 了解接入服務層 374
15.5.2 在Alink中發(fā)送預測數(shù)據(jù) 374
15.5.3 實現(xiàn)廣告服務器接收預測數(shù)據(jù) 375
15.6 日志打點和監(jiān)測 376
-
附 錄 377
難懂概念介紹 377
Flink常見問題匯總 378
Alink常見問題匯總 381