本书针对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基础的开发人员、大数据领域从业人员的参考用书。另外,阅读本书的读者不需要具备高等数学知识和人工智能的底层算法知识。
12年来一直在某一线互联网公司担任资深系统分析师。目前带领3个研发团队,承担系统的分析、设计、实施、演进以及技术团队管理和培训等职责。《Spring Boot实战派》《Spring Cloud微服务架构实战派》作者
入门篇
第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
10.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