Flink 實戰派 (雙色版)

龍中華

買這商品的人也買了...

商品描述

本書針對Flink 1.11版本和Alink 1.2版本,採用“知識點+實例”的形式編寫,包括47個基於知識點的實例和1個綜合項目實例。第1章對大數據和人工智能進行初步介紹;第2章用一個實例總覽Flink的關鍵知識點;第3~5章介紹Flink的架構、開發基礎和轉換算子;第6、7、10、11章深入講解4種開發Flink應用程序的API;第8、9章講解操作Flink狀態(計算和容錯)的狀態處理器API和用於處理復雜事件(異常檢測、反欺詐、風險控制)的CEP庫;第12章講解Flink如何與其他外部系統集成,並實現Flink與Kafka的集成;第13章介紹機器學習的基礎知識;第14章講解機器學習框架Alink的知識和實戰應用;第15章是項目實戰,使用大數據和機器學習技術實現一個廣告推薦系統(包含離線訓練、在線訓練、實時預測和在線服務)。本書可以作為具備Java基礎的開發人員、大數據領域從業人員的參考用書。另外,閱讀本書的讀者不需要具備高等數學知識和人工智能的底層算法知識。

作者簡介

龍中華
10多年來一直在某一線互聯網公司擔任技術負責人。
目前帶領多個研發團隊,承擔系統的需求分析、架構設計、項目管理,以及技術團隊管理和培訓等職責。

目錄大綱

入門篇 
第1章 進入大數據和人工智能世界 2 
1.1 認識大數據和人工智能 2 
1.2 認識Flink 4 
1.2.1 Flink是什麽 4 
1.2.2 Flink的發展歷程 4 
1.2.3 Flink的應用場景 6 
1.3 認識Alink 6 
1.4 如何使用本書的源碼 6 

第2章 
【實例1】使用Flink的4種API處理無界數據流和有界數據流 8 
2.1 創建Flink應用程序 8 
2.2 使用DataSet API處理有界數據流 10 
2.2.1 編寫批處理代碼 10 
2.2.2 配置依賴作用域 11 
2.2.3 測試Flink應用程序 12 
2.3 使用DataStream API處理無界數據流 12 
2.3.1 自定義無界數據流數據源 12 
2.3.2 編寫無界數據流處理代碼 13 
2.3.3 使用DataStream API的窗口功能處理無界數據流 14 
2.4 使用Table API處理無界數據流和有界數據流 16 
2.4.1 處理無界數據流 16 2.4.2 處理有界數據流 17 
2.5 使用SQL處理無界數據流和有界數據流 19 
2.5.1 處理無界數據流 19 
2.5.2 處理有界數據流 19 
2.6 生成執行計劃圖 20 

基礎篇 
第3章 概覽Flink 24 
3.1 瞭解流處理和批處理 24 
3.1.1 數據流 24 
3.1.2 流處理 25 
3.1.3 流式的批處理 26 
3.1.4 有狀態流處理 27 
3.1.5 並行數據流 28 
3.2 Flink的整體架構 29 
3.2.1 部署層 30 
3.2.2 執行引擎層 30 
3.2.3 核心API層 30 
3.2.4 領域庫層 30 
3.3 Flink的編程接口 31 
3.3.1 有狀態實時流處理接口 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 瞭解分佈式執行引擎的環境 38 
3.5.1 作業管理器、任務管理器、客戶端 38 
3.5.2 任務插槽和資源 40 
3.5.3 Flink應用程序的執行 41 

第4章 Flink開發基礎 43 
4.1 開發Flink應用程序的流程 43 
4.1.1 瞭解Flink應用程序的結構 43 
4.1.2 配置執行環境和參數 44 
4.1.3 初始化數據源 46 
4.1.4 數據轉換 46 
4.1.5 輸出結果和觸發程序 47 
4.2 處理參數 49 
4.2.1 將參數傳遞給函數 49 
4.2.2 用參數工具讀取參數 50 
4.2.3 在Flink應用程序中使用參數 51 
4.2.4 【實例2】通過withParameters()方法傳遞和使用參數 53 
4.2.5 【實例3】通過參數工具讀取和使用參數 54 
4.3 自定義函數 56 
4.3.1 自定義函數的常用方式 56 
4.3.2 瞭解累加器和計數器 57 
4.3.3 【實例4】實現累加器 58 
4.4 數據類型和序列化 59 
4.4.1 認識數據類型 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 使用鍵選擇器函數定義鍵 71 
5.2 Flink的通用轉換算子 71 
5.2.1 DataStream和DataSet的通用轉換算子 71 
5.2.2 【實例7】使用Map算子轉換數據 72 
5.2.3 【實例8】使用FlatMap算子拆分句子 73 
5.2.4 【實例9】使用Filter算子過濾數據 74 
5.2.5 【實例10】使用Project算子投射字段並排序 75 
5.3 Flink的DataSet API專用轉換算子 76 
5.3.1 聚合轉換算子 76 
5.3.2 分區轉換算子 78 
5.3.3 排序轉換算子 79 
5.3.4 關聯轉換算子 80 
5.3.5 【實例11】在按字段位置鍵分組的數據集上進行聚合轉換 81 
5.3.6 【實例12】在分組元組上進行比較運算 82 
5.3.7 【實例13】使用MapPartition算子統計數據集的分區計數 83 
5.3.8 【實例14】對POJO數據集和元組進行分組與聚合 84 
5.3.9 【實例15】使用First-n算子返回數據集的前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 物理分區算子 95 
5.4.6 其他轉換算子 96 
5.4.7 【實例16】使用Union算子連接多個數據源 97 
5.4.8 【實例17】使用Connect算子連接不同類型的數據源 98 
5.4.9 【實例18】使用Reduce操作鍵控流 99 
5.4.10 【實例19】使用Split算子和Select算子拆分數據流,並選擇拆分後的數據流 100 
5.4.11 任務、算子鏈和資源組 101 5.5 認識低階流處理算子 103 
5.5.1 ProcessFunction——在非循環流上實現低階運算 103 
5.5.2 CoProcessFunction——在兩個輸入流上實現低階運算 104 
5.5.3 KeyedProcessFunction——在鍵控流上實現低階運算 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】實現DataStream的歸零迭代運算 112 

進階篇 
第6章 使用DataSet API實現批處理 116 
6.1 DataSet API的數據源 116 
6.1.1 認識DataSet API的數據源 116 
6.1.2 配置CSV解析 117 
6.1.3 【實例23】讀取和解析CSV文件 118 
6.1.4 讀取壓縮文件 119 
6.2 操作函數中的數據對象 121 
6.2.1 禁用對象重用 121 
6.2.2 啟用對象重用 122 
6.3 語義註釋 122 
6.3.1 轉發字段註釋 123 
6.3.2 【實例24】使用函數類註釋聲明轉發字段信息 124 
6.3.3 非轉發字段 125 
6.3.4 【實例25】聲明非轉發字段 125 
6.3.5 讀取字段信息 126 
6.3.6 【實例26】聲明讀取字段信息 126 
6.4 認識分佈式緩存和廣播變量 127 
6.4.1 分佈式緩存 127 
6.4.2 廣播變量 128 

第7章 使用DataStream API實現流處理 130 
7.1 認識DataStream API 130 
7.1.1 DataStream API的數據源 130 
7.1.2 DataStream API的數據接收器 131 
7.2 窗口 132 
7.2.1 認識時間驅動和數據驅動的窗口 132 
7.2.2 認識窗口分配器 133 
7.2.3 認識鍵控窗口和非鍵控窗口 138 
7.2.4 認識窗口的生命周期 139 
7.2.5 【實例27】實現滾動時間窗口和滑動時間窗口 140 
7.2.6 【實例28】實現滾動計數窗口和滑動計數窗口 141 
7.2.7 【實例29】實現會話窗口 144 
7.2.8 認識窗口函數 146 
7.2.9 【實例30】使用窗口函數實現窗口內的計算 148 
7.2.10 觸發器 152 
7.2.11 【實例31】自定義觸發器 154 
7.2.12 移除器 155 
7.2.13 處理遲到數據 156 
7.2.14 處理窗口結果 157 
7.3 認識時間和水位線生成器 159 
7.3.1 認識時間 159 
7.3.2 設置時間特徵 160 
7.3.3 認識水位線 161 
7.3.4 內置水位線生成器 166 
7.3.5 編寫水位線生成器 167 
7.4 狀態 169 
7.4.1 認識狀態 169 
7.4.2 使用算子狀態 172 
7.4.3 認識鍵控流 173 
7.4.4 使用鍵控狀態 174 
7.5 狀態持久化 178 
7.5.1 檢查點 178 
7.5.2 狀態快照 180 
7.5.3 保存點 182 
7.5.4 狀態後端 182 
7.5.5 比較快照、檢查點、保存點和狀態後端 184 
7.6 旁路輸出 184 
7.6.1 認識旁路輸出 184 
7.6.2 【實例32】輸出多條旁路數據流 186 
7.7 數據處理語義 187 
7.7.1 認識數據處理語義 187 
7.7.2 兩階段提交 188 
7.7.3 Flink“兩階段提交”的事務性寫入 189 
7.8 【實例33】自定義事件時間和水位線 191 

第8章 使用狀態處理器API——State Processor API 193 
8.1 認識狀態處理器API 193 
8.2 將應用程序狀態映射到DataSet 194 
8.3 讀取狀態 194 
8.3.1 讀取算子狀態 194 
8.3.2 讀取鍵控狀態 196 
8.4 編寫新的保存點 198 
8.5 修改保存點 200 
8.6 【實例34】使用狀態處理器API寫入和讀取保存點 201 

第9章 復雜事件處理庫 204 
9.1 認識復雜事件處理庫 204 
9.2 【實例35】實現3種模式的CEP應用程序 205 
9.2.1 實現單個模式的CEP應用程序 205 
9.2.2 實現循環模式的CEP應用程序 206 
9.2.3 實現組合模式的CEP應用程序 207 
9.3 認識模式API 207 
9.3.1 單個模式 207 
9.3.2 組合模式 212 
9.3.3 循環模式中的連續性 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實現流/批統一處理 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的環境 225 
10.1.4 認識計劃器——OldPlanner和BlinkPlanner 226 
10.1.5 查詢和輸出表 230 
10.2 Table API和SQL的“流”的概念 232 
10.2.1 認識動態表 232 1
0.2.2 在Table API和SQL中定義時間屬性 238 
10.2.3 流上的連接 242 
10.2.4 認識時態表 243 
10.3 Catalog 244 
10.3.1 認識Catalog 244 
10.3.2 【實例36】使用Java和SQL的DDL方式創建Catalog、Catalog數據庫與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創建視圖與表 252 
10.4.3 將表轉換成DataStream或DataSet 253 
10.4.4 從數據類型到Table Schema的映射 255 
10.4.5 【實例37】使用Table API轉換DataSet,並應用Group算子、Aggregate算子、Select算子和Filter算子 258 
10.4.6 【實例38】使用SQL轉換DataSet,並註冊表和執行SQL查詢 259 

第11章 使用SQL實現流/批統一處理 261 
11.1 SQL客戶端 261 11.2 SQL語句 263 
11.2.1 認識SQL語句 263 
11.2.2 CREATE語句 264 
11.2.3 【實例39】使用CREATE語句創建和查詢表 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 變更數據獲取 293 
11.3.1 瞭解變更數據獲取 293 
11.3.2 【實例42】獲取MySQL變更數據 293 
11.4 認識流式聚合 296 
11.5 【實例43】使用DDL創建表,並進行流式窗口聚合 299 

第12章 集成外部系統 303 
12.1 認識Flink的連接器 303 
12.1.1 內置的連接器 303 
12.1.2 Table&SQL的連接器 304 
12.2 異步訪問外部數據 307 
12.3 外部系統拉取Flink數據 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生產者 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中生產和消費Kafka消息 325 
12.5.1 添加Flink的依賴 325 
12.5.2 自定義數據源 325 
12.5.3 編寫消息生產者 326 
12.5.4 編寫消息消費者 327 
12.5.5 測試在Flink中生產和消費Kafka消息 327 

機器學習篇 
第13章 進入機器學習世界 330 
13.1 學習人工智能的經驗 330 
13.2 認識機器學習 331 
13.3 機器學習的主要任務 332 
13.3.1 分類 332 
13.3.2 回歸 333 
13.3.3 聚類 333 
13.4 開發機器學習應用程序的基礎 333 
13.4.1 機器學習的概念 333 
13.4.2 開發機器學習應用程序的步驟 334 
13.5 機器學習的分類 336 
13.5.1 監督式學習 336 
13.5.2 無監督式學習 336 
13.5.3 半監督式學習 336 
13.5.4 增強學習 336 
13.6 瞭解機器學習算法 337 
13.7 機器學習的評估模型 339 
13.7.1 認識評估模型 339 
13.7.2 認識二分類評估 339 
13.7.3 認識多分類評估、聚類評估和回歸評估 342 

第14章 流/批統一的機器學習框架(平臺)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】以流/批方式讀取、取樣和輸出數據集 346 
14.2.1 創建Alink應用程序 346 
14.2.2 按行讀取、拆分和輸出數據集 348 
14.2.3 讀取、取樣和輸出Libsvm格式的數據集 349 
14.2.4 讀取、取樣CSV格式的數據集 350 
14.2.5 讀取、解析和輸出Kafka的數據集 351 
14.3 【實例46】使用分類算法實現數據的情感分析 353 
14.3.1 認識邏輯回歸算法 353 
14.3.2 讀取數據並設置管道 354 
14.3.3 訓練模型和預測 355 
14.3.4 保存、查看和復用模型 356 
14.4 【實例47】實現協同過濾式的推薦系統 357 
14.4.1 瞭解訓練集 357 
14.4.2 實現機器學習應用程序 357 
14.4.3 測試推薦系統 359 

項目實戰篇 
第15章 【實例48】使用大數據和機器學習技術實現一個廣告推薦系統 362 
15.1 瞭解【實例架構 362 
15.1.2 【實例架構 362 
15.1.2 廣告推薦流程 363 
15.1.3 機器學習流程 364 
15.2 瞭解推薦系統 364 
15.2.1 什麽是推薦系統 364 
15.2.2 推薦系統的分類 365 
15.2.3 推薦系統的排序算法 366 
15.2.4 召回算法 367 
15.3 認識在線學習算法 367 
15.3.1 離線訓練和在線訓練 367 
15.3.2 在線學習算法FTRL 368 
15.4 實現機器學習 369 
15.4.1 處理數據 369 
15.4.2 特徵工程 370 
15.4.3 離線模型訓練 371 
15.4.4 在線模型訓練 371 
15.4.5 在線預測 372 
15.4.6 在線評估 372 
15.5 實現接入服務層 374 
15.5.1 瞭解接入服務層 374 
15.5.2 在Alink中發送預測數據 374 
15.5.3 實現廣告服務器接收預測數據 375 
15.6 日誌打點和監測 376 

附 錄 377 
難懂概念介紹 377 
Flink常見問題匯總 378 
Alink常見問題匯總 381