本书从Apache Flink的缘起开始,由浅入深,理论结合实践,全方位地介绍Apache Flink这一处理海量数据集的高性能工具。本书围绕部署、流处理、批处理、Table API和SQL四大模块进行讲解,并详细说明Apache Flink的每个特性的实际业务背景,使读者不仅能编写可运行的Apache Flink程序代码,还能深刻理解并正确地将其运用到合适的生产业务环境中。虽然本书是以Apache Flink技术框架来讲解流计算技术的,但是流计算领域开发所面临的各种问题同样是Java后端开发者在进行服务端开发时所要面临的,如有状态计算、Exactly Once语义等。因此,Apache Flink框架为解决这些问题而设计的方案同样值得Java后端开发者借鉴。本书适合初级和中级软件工程师阅读,未接触过流计算领域的Java开发者也可以从本书中获益。针对初学者,本书提供Windows环境搭建的演示,使不具备Linux系统操作经验的读者也可以快速学习Apache Flink。
国家认证软件设计师,获得Apache Kylin管理员认证。现任某上市咨询公司高级咨询顾问,有多年大数据、流式计算方面的开发经验,对Hadoop、Strom、Flink等大数据计算引擎有着非常深入的理解,积累了丰富的项目实践经验。先后利用相关技术为银行、保险、能源等领域的头部企业解决业务痛点。个人技术博客: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应用场景
1.2 Apache Flink组件
1.2.1 分层API
1.2.2 作业管理器、任务管理器、客户端
第2章 Apache Flink的安装与部署
2.1 本地模式
2.1.1 安装JDK
2.1.2 下载并安装Flink
2.1.3 本地模式集群
2.1.4 Windows系统部署
2.2 Standalone模式
2.2.1 配置集群免密登录
2.2.2 部署Standalone模式的集群
2.3 YARN模式
2.3.1 在YARN集群中启动一个长期运行的Flink集群
2.3.2 在YARN集群中运行Flink作业
2.3.3 Flink和YARN的交互方式
2.3.4 问题汇总
2.4 Flink集群高可用
2.4.1 Standalone模式下JobManager的高可用
2.4.2 YARN模式下JobManager的高可用
第3章 Apache Flink的基础概念和通用API
3.1 基础概念
3.1.1 数据集和数据流
3.1.2 Flink程序的组成
3.1.3 延迟计算
3.1.4 指定分组数据集合的键
3.1.5 指定转换函数
3.1.6 支持的数据类型
3.2 Flink程序模型
3.2.1 程序和数据流
3.2.2 并行数据流
3.2.3 窗口
3.2.4 时间
3.2.5 有状态计算
3.2.6 容错检查点
3.2.7 状态后端
3.2.8 保存点
3.3 Flink程序的分布式执行模型
3.3.1 任务和任务链
3.3.2 任务槽和资源
3.4 Java的Lambda表达式
3.4.1 类型擦除
3.4.2 类型提示
第4章 流处理基础操作
4.1 DataStream的基本概念
4.1.1 流处理示例程序
4.1.2 数据源
4.1.3 数据流的转换操作
4.1.4 数据接收器
4.2 数据流基本操作
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 富函数
4.3.1 基本概念
4.3.2 代码演示
4.4 任务链和资源组
4.4.1 默认链接
4.4.2 开启新链接
4.4.3 禁用链接
4.4.4 设置任务槽共享组
4.5 物理分区
4.5.1 自定义分区策略
4.5.2 shuffle分区策略
4.5.3 broadcast分区策略
4.5.4 rebalance分区策略
4.5.5 rescale分区策略
4.5.6 forward分区策略
4.5.7 global分区策略
4.6 流处理的本地测试
4.6.1 本地执行环境
4.6.2 集合支持的数据源和数据接收器
4.6.3 单元测试
4.6.4 集成测试
4.7 分布式缓存
4.7.1 注册分布式缓存文件
4.7.2 访问分布式缓存文件
4.7.3 BLOB服务的配置参数
4.7.4 部署到集群中运行
4.8 将参数传递给函数
4.8.1 通过构造函数传递参数
4.8.2 使用ExecutionConfig传递参数
4.8.3 将命令行参数传递给函数
第5章 流处理中的状态和容错
5.1 有状态计算
5.1.1 Operator状态和Keyed状态
5.1.2 托管的Keyed状态
5.1.3 托管的Operator状态
5.2 检查点机制
5.2.1 先决条件
5.2.2 启用和配置检查点机制
5.2.3 目录结构
5.2.4 其他相关的配置选项
5.3 状态后端
5.3.1 MemoryStateBackend
5.3.2 FsStateBackend
5.3.3 RocksDBStateBackend
5.3.4 配置状态后端
5.4 保存点机制
5.4.1 分配操作符id
5.4.2 保存点映射
5.4.3 保存点操作
5.4.4 保存点配置
5.5 广播状态
5.5.1 前置条件
5.5.2 广播函数
5.5.3 代码实现
5.6 调优检查点和大状态
5.6.1 监视状态和检查点
5.6.2 调优检查点
5.6.3 使用异步检查点操作
5.6.4 调优RocksDB
5.6.5 容量规划
5.6.6 压缩
第6章 流处理高级操作
6.1 窗口
6.1.1 窗口的基本概念
6.1.2 窗口分配器
6.1.3 窗口函数
6.1.4 窗口触发器
6.1.5 窗口剔除器
6.1.6 允许数据延迟
6.1.7 窗口的快速实现方法
6.1.8 查看窗口使用组件
6.2 时间
6.2.1 时间语义
6.2.2 事件时间与水印
6.2.3 设置时间特性
6.3 数据流的连接操作
6.3.1 窗口Join
6.3.2 窗口CoGroup
6.3.3 间隔Join
6.4 侧端输出
6.4.1 基于复制数据流的方案
6.4.2 基于Split和Select的方案
6.4.3 基于侧端输出的方案
6.5 ProcessFunction
6.5.1 基本概念
6.5.2 计时器
6.6 自定义数据源函数
6.6.1 SourceFunction接口
6.6.2 ParallelSourceFunction接口
6.6.3 RichParallelSourceFunction抽象类
6.6.4 具备检查点特性的数据源函数
6.7 自定义数据接收器函数
6.7.1 SinkFunction接口
6.7.2 RichSinkFunction抽象类
6.8 数据流连接器
6.8.1 内置连接器
6.8.2 数据源和数据接收器的容错保证
6.8.3 Kafka连接器
6.8.4 安装Kafka的注意事项
6.8.5 Kafka 1.0.0+ 连接器
6.8.6 Kafka消费者
6.8.7 Kafka生产者
6.8.8 Kafka连接器指标
第7章 批处理基础操作
7.1 DataSet的基本概念
7.1.1 批处理示例程序
7.1.2 数据源
7.1.3 数据接收器
7.2 数据集的基本操作
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 将参数传递给函数
7.4 广播变量
7.4.1 注册广播变量
7.4.2 访问广播变量
7.4.3 代码实现
7.5 物理分区
7.5.1 Rebalance
7.5.2 PartitionByHash
7.5.3 PartitionByRange
7.5.4 SortPartition
7.6 批处理的本地测试
7.6.1 本地执行环境
7.6.2 集合支持的数据源和数据接收器
第8章 Table API和SQL
8.1 基础概念和通用API
8.1.1 添加依赖
8.1.2 第一个Hello World表程序
8.1.3 表程序的公共结构
8.1.4 创建一个TableEnvironment
8.1.5 在目录中注册表
8.1.6 查询一个表
8.1.7 DataStream和DataSet API的集成
8.1.8 数据类型到表模式的映射
8.1.9 查询优化
8.2 SQL
8.2.1 指定一个查询
8.2.2 SQL支持的语法
8.2.3 SQL操作
8.2.4 数据类型
8.2.5 保留关键字
8.3 Table API
8.4 自定义函数
8.4.1 标量函数
8.4.2 表函数
8.4.3 聚合函数
8.4.4 自定义函数与运行环境集成
8.5 SQL客户端
8.5.1 启动SQL客户端
8.5.2 配置参数
8.5.3 分离的SQL查询
8.5.4 SQL客户端中的视图
8.5.5 SQL客户端中的时态表
第9章 流处理中的Table API和SQL
9.1 动态表
9.1.1 动态表和连续查询
9.1.2 在数据流中定义动态表
9.1.3 动态表到数据流的转换
9.2 时间属性
9.2.1 基本概念
9.2.2 组窗口
9.2.3 处理时间
9.2.4 事件时间
9.3 动态表的Join
9.3.1 常规Join
9.3.2 时间窗口Join
9.4 时态表
9.4.1 需求背景
9.4.2 时态表函数
9.5 查询配置
9.5.1 查询配置对象
9.5.2 空闲状态保留时间
9.6 连接外部系统
9.6.1 概述
9.6.2 表模式
9.6.3 更新模式
9.6.4 表格式
9.6.5 表连接器
9.6.6 未统一的TableSources和TableSinks
第10章 执行管理
10.1 执行参数
10.1.1 在ExecutionEnvironment中设置参数
10.1.2 在ExecutionConfig中设置参数
10.2 并行执行
10.2.1 操作符级别
10.2.2 执行环境级别
10.2.3 客户端级别
10.2.4 系统级别
10.2.5 设置最大并行度
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 列出集群中的作业
10.5.3 调整集群中的作业
10.5.4 保存点操作命令
10.6 执行计划
10.6.1 在线可视化工具
10.6.2 Web管控台可视化