本書從Apache Flink的緣起開始,由淺入深,理論結(jié)合實踐,全方位地介紹Apache Flink這一處理海量數(shù)據(jù)集的高性能工具。本書圍繞部署、流處理、批處理、Table API和SQL四大模塊進(jìn)行講解,并詳細(xì)說明Apache Flink的每個特性的實際業(yè)務(wù)背景,使讀者不僅能編寫可運行的Apache Flink程序代碼,還能深刻理解并正確地將其運用到合適的生產(chǎn)業(yè)務(wù)環(huán)境中。雖然本書是以Apache Flink技術(shù)框架來講解流計算技術(shù)的,但是流計算領(lǐng)域開發(fā)所面臨的各種問題同樣是Java后端開發(fā)者在進(jìn)行服務(wù)端開發(fā)時所要面臨的,如有狀態(tài)計算、Exactly Once語義等。因此,Apache Flink框架為解決這些問題而設(shè)計的方案同樣值得Java后端開發(fā)者借鑒。本書適合初級和中級軟件工程師閱讀,未接觸過流計算領(lǐng)域的Java開發(fā)者也可以從本書中獲益。針對初學(xué)者,本書提供Windows環(huán)境搭建的演示,使不具備Linux系統(tǒng)操作經(jīng)驗的讀者也可以快速學(xué)習(xí)Apache Flink。
國家認(rèn)證軟件設(shè)計師,獲得Apache Kylin管理員認(rèn)證,F(xiàn)任某上市咨詢公司高級咨詢顧問,有多年大數(shù)據(jù)、流式計算方面的開發(fā)經(jīng)驗,對Hadoop、Strom、Flink等大數(shù)據(jù)計算引擎有著非常深入的理解,積累了豐富的項目實踐經(jīng)驗。先后利用相關(guān)技術(shù)為銀行、保險、能源等領(lǐng)域的頭部企業(yè)解決業(yè)務(wù)痛點。個人技術(shù)博客:www.cnblogs.com/intsmaze個人Github項目:github.com/intsmaze
目錄
第1章 Apache Flink介紹
1.1 Apache Flink簡介
1.1.1 Apache Flink是什么
1.1.2 Apache Flink應(yīng)用場景
1.2 Apache Flink組件
1.2.1 分層API
1.2.2 作業(yè)管理器、任務(wù)管理器、客戶端
第2章 Apache Flink的安裝與部署
2.1 本地模式
2.1.1 安裝JDK
2.1.2 下載并安裝Flink
2.1.3 本地模式集群
2.1.4 Windows系統(tǒng)部署
2.2 Standalone模式
2.2.1 配置集群免密登錄
2.2.2 部署Standalone模式的集群
2.3 YARN模式
2.3.1 在YARN集群中啟動一個長期運行的Flink集群
2.3.2 在YARN集群中運行Flink作業(yè)
2.3.3 Flink和YARN的交互方式
2.3.4 問題匯總
2.4 Flink集群高可用
2.4.1 Standalone模式下JobManager的高可用
2.4.2 YARN模式下JobManager的高可用
第3章 Apache Flink的基礎(chǔ)概念和通用API
3.1 基礎(chǔ)概念
3.1.1 數(shù)據(jù)集和數(shù)據(jù)流
3.1.2 Flink程序的組成
3.1.3 延遲計算
3.1.4 指定分組數(shù)據(jù)集合的鍵
3.1.5 指定轉(zhuǎn)換函數(shù)
3.1.6 支持的數(shù)據(jù)類型
3.2 Flink程序模型
3.2.1 程序和數(shù)據(jù)流
3.2.2 并行數(shù)據(jù)流
3.2.3 窗口
3.2.4 時間
3.2.5 有狀態(tài)計算
3.2.6 容錯檢查點
3.2.7 狀態(tài)后端
3.2.8 保存點
3.3 Flink程序的分布式執(zhí)行模型
3.3.1 任務(wù)和任務(wù)鏈
3.3.2 任務(wù)槽和資源
3.4 Java的Lambda表達(dá)式
3.4.1 類型擦除
3.4.2 類型提示
第4章 流處理基礎(chǔ)操作
4.1 DataStream的基本概念
4.1.1 流處理示例程序
4.1.2 數(shù)據(jù)源
4.1.3 數(shù)據(jù)流的轉(zhuǎn)換操作
4.1.4 數(shù)據(jù)接收器
4.2 數(shù)據(jù)流基本操作
4.2.1 Map
4.2.2 FlatMap
4.2.3 Filter
4.2.4 KeyBy
4.2.5 Reduce
4.2.6 Aggregations
4.2.7 Split和Select
4.2.8 Project
4.2.9 Union
4.2.10 Connect和CoMap、CoFlatMap
4.2.11 Iterate
4.3 富函數(shù)
4.3.1 基本概念
4.3.2 代碼演示
4.4 任務(wù)鏈和資源組
4.4.1 默認(rèn)鏈接
4.4.2 開啟新鏈接
4.4.3 禁用鏈接
4.4.4 設(shè)置任務(wù)槽共享組
4.5 物理分區(qū)
4.5.1 自定義分區(qū)策略
4.5.2 shuffle分區(qū)策略
4.5.3 broadcast分區(qū)策略
4.5.4 rebalance分區(qū)策略
4.5.5 rescale分區(qū)策略
4.5.6 forward分區(qū)策略
4.5.7 global分區(qū)策略
4.6 流處理的本地測試
4.6.1 本地執(zhí)行環(huán)境
4.6.2 集合支持的數(shù)據(jù)源和數(shù)據(jù)接收器
4.6.3 單元測試
4.6.4 集成測試
4.7 分布式緩存
4.7.1 注冊分布式緩存文件
4.7.2 訪問分布式緩存文件
4.7.3 BLOB服務(wù)的配置參數(shù)
4.7.4 部署到集群中運行
4.8 將參數(shù)傳遞給函數(shù)
4.8.1 通過構(gòu)造函數(shù)傳遞參數(shù)
4.8.2 使用ExecutionConfig傳遞參數(shù)
4.8.3 將命令行參數(shù)傳遞給函數(shù)
第5章 流處理中的狀態(tài)和容錯
5.1 有狀態(tài)計算
5.1.1 Operator狀態(tài)和Keyed狀態(tài)
5.1.2 托管的Keyed狀態(tài)
5.1.3 托管的Operator狀態(tài)
5.2 檢查點機(jī)制
5.2.1 先決條件
5.2.2 啟用和配置檢查點機(jī)制
5.2.3 目錄結(jié)構(gòu)
5.2.4 其他相關(guān)的配置選項
5.3 狀態(tài)后端
5.3.1 MemoryStateBackend
5.3.2 FsStateBackend
5.3.3 RocksDBStateBackend
5.3.4 配置狀態(tài)后端
5.4 保存點機(jī)制
5.4.1 分配操作符id
5.4.2 保存點映射
5.4.3 保存點操作
5.4.4 保存點配置
5.5 廣播狀態(tài)
5.5.1 前置條件
5.5.2 廣播函數(shù)
5.5.3 代碼實現(xiàn)
5.6 調(diào)優(yōu)檢查點和大狀態(tài)
5.6.1 監(jiān)視狀態(tài)和檢查點
5.6.2 調(diào)優(yōu)檢查點
5.6.3 使用異步檢查點操作
5.6.4 調(diào)優(yōu)RocksDB
5.6.5 容量規(guī)劃
5.6.6 壓縮
第6章 流處理高級操作
6.1 窗口
6.1.1 窗口的基本概念
6.1.2 窗口分配器
6.1.3 窗口函數(shù)
6.1.4 窗口觸發(fā)器
6.1.5 窗口剔除器
6.1.6 允許數(shù)據(jù)延遲
6.1.7 窗口的快速實現(xiàn)方法
6.1.8 查看窗口使用組件
6.2 時間
6.2.1 時間語義
6.2.2 事件時間與水印
6.2.3 設(shè)置時間特性
6.3 數(shù)據(jù)流的連接操作
6.3.1 窗口Join
6.3.2 窗口CoGroup
6.3.3 間隔Join
6.4 側(cè)端輸出
6.4.1 基于復(fù)制數(shù)據(jù)流的方案
6.4.2 基于Split和Select的方案
6.4.3 基于側(cè)端輸出的方案
6.5 ProcessFunction
6.5.1 基本概念
6.5.2 計時器
6.6 自定義數(shù)據(jù)源函數(shù)
6.6.1 SourceFunction接口
6.6.2 ParallelSourceFunction接口
6.6.3 RichParallelSourceFunction抽象類
6.6.4 具備檢查點特性的數(shù)據(jù)源函數(shù)
6.7 自定義數(shù)據(jù)接收器函數(shù)
6.7.1 SinkFunction接口
6.7.2 RichSinkFunction抽象類
6.8 數(shù)據(jù)流連接器
6.8.1 內(nèi)置連接器
6.8.2 數(shù)據(jù)源和數(shù)據(jù)接收器的容錯保證
6.8.3 Kafka連接器
6.8.4 安裝Kafka的注意事項
6.8.5 Kafka 1.0.0+ 連接器
6.8.6 Kafka消費者
6.8.7 Kafka生產(chǎn)者
6.8.8 Kafka連接器指標(biāo)
第7章 批處理基礎(chǔ)操作
7.1 DataSet的基本概念
7.1.1 批處理示例程序
7.1.2 數(shù)據(jù)源
7.1.3 數(shù)據(jù)接收器
7.2 數(shù)據(jù)集的基本操作
7.2.1 Map
7.2.2 FlatMap
7.2.3 MapPartition
7.2.4 Filter
7.2.5 Project
7.2.6 Union
7.2.7 Distinct
7.2.8 GroupBy
7.2.9 Reduce
7.2.10 ReduceGroup
7.2.11 Aggregate
7.2.12 Join
7.2.13 OuterJoin
7.2.14 Cross
7.2.15 CoGroup
7.3 將參數(shù)傳遞給函數(shù)
7.4 廣播變量
7.4.1 注冊廣播變量
7.4.2 訪問廣播變量
7.4.3 代碼實現(xiàn)
7.5 物理分區(qū)
7.5.1 Rebalance
7.5.2 PartitionByHash
7.5.3 PartitionByRange
7.5.4 SortPartition
7.6 批處理的本地測試
7.6.1 本地執(zhí)行環(huán)境
7.6.2 集合支持的數(shù)據(jù)源和數(shù)據(jù)接收器
第8章 Table API和SQL
8.1 基礎(chǔ)概念和通用API
8.1.1 添加依賴
8.1.2 第一個Hello World表程序
8.1.3 表程序的公共結(jié)構(gòu)
8.1.4 創(chuàng)建一個TableEnvironment
8.1.5 在目錄中注冊表
8.1.6 查詢一個表
8.1.7 DataStream和DataSet API的集成
8.1.8 數(shù)據(jù)類型到表模式的映射
8.1.9 查詢優(yōu)化
8.2 SQL
8.2.1 指定一個查詢
8.2.2 SQL支持的語法
8.2.3 SQL操作
8.2.4 數(shù)據(jù)類型
8.2.5 保留關(guān)鍵字
8.3 Table API
8.4 自定義函數(shù)
8.4.1 標(biāo)量函數(shù)
8.4.2 表函數(shù)
8.4.3 聚合函數(shù)
8.4.4 自定義函數(shù)與運行環(huán)境集成
8.5 SQL客戶端
8.5.1 啟動SQL客戶端
8.5.2 配置參數(shù)
8.5.3 分離的SQL查詢
8.5.4 SQL客戶端中的視圖
8.5.5 SQL客戶端中的時態(tài)表
第9章 流處理中的Table API和SQL
9.1 動態(tài)表
9.1.1 動態(tài)表和連續(xù)查詢
9.1.2 在數(shù)據(jù)流中定義動態(tài)表
9.1.3 動態(tài)表到數(shù)據(jù)流的轉(zhuǎn)換
9.2 時間屬性
9.2.1 基本概念
9.2.2 組窗口
9.2.3 處理時間
9.2.4 事件時間
9.3 動態(tài)表的Join
9.3.1 常規(guī)Join
9.3.2 時間窗口Join
9.4 時態(tài)表
9.4.1 需求背景
9.4.2 時態(tài)表函數(shù)
9.5 查詢配置
9.5.1 查詢配置對象
9.5.2 空閑狀態(tài)保留時間
9.6 連接外部系統(tǒng)
9.6.1 概述
9.6.2 表模式
9.6.3 更新模式
9.6.4 表格式
9.6.5 表連接器
9.6.6 未統(tǒng)一的TableSources和TableSinks
第10章 執(zhí)行管理
10.1 執(zhí)行參數(shù)
10.1.1 在ExecutionEnvironment中設(shè)置參數(shù)
10.1.2 在ExecutionConfig中設(shè)置參數(shù)
10.2 并行執(zhí)行
10.2.1 操作符級別
10.2.2 執(zhí)行環(huán)境級別
10.2.3 客戶端級別
10.2.4 系統(tǒng)級別
10.2.5 設(shè)置最大并行度
10.3 重啟策略
10.3.1 固定延遲重啟策略
10.3.2 故障率重啟策略
10.3.3 沒有重新啟動策略
10.3.4 回退重啟策略
10.4 程序打包和部署
10.4.1 打包Flink程序
10.4.2 Web UI(Web管控臺)提交
10.4.3 命令行客戶端提交
10.5 命令行接口
10.5.1 將Flink程序提交到Flink集群
10.5.2 列出集群中的作業(yè)
10.5.3 調(diào)整集群中的作業(yè)
10.5.4 保存點操作命令
10.6 執(zhí)行計劃
10.6.1 在線可視化工具
10.6.2 Web管控臺可視化