注重体验与质量的电子书资源下载网站
分类于: 人工智能 计算机基础
简介
Spark大数据分析:源码解析与实例详解 豆 0.0分
资源最后更新于 2020-10-29 13:01:52
作者:刘景泽 编著
出版社:电子工业出版社
出版日期:2019-01
ISBN:9787121370519
文件格式: pdf
简介· · · · · ·
《Spark大数据分析:源码解析与实例详解》基于Spark 2.3.x、Spark 2.4.x系列版本,采用“理论+实践”的形式编写。全书共有90个实例,1个完整项目。
第1篇“准备”,包括认识大数据和Spark、安装与配置Spark集群、第1个Spark程序;第2篇“入门”,包括读写分布式数据、处理分布式数据;第3篇“进阶”,包括RDD的高级操作、用SQL语法分析结构化数据、实时处理流式数据;第4篇“高阶”,包括实时处理流式数据、Spark的相关优化;第5篇“商业项目实战”,用Spark的各种组件实现一个学生学情分析商业项目。
《Spark大数据分析:源码解析与实例详解》结构清晰、实例丰富、通俗易懂、实用性强,特别适合Spark的初学者和进阶读者作为自学用书。另外,本书也适合社会培训学校作为培训教材,还适合大中专院校的相关专业作为教学参考书。
目录
==第1篇 准备
∣
=第1章 认识大数据和Spark /2
1.1 大数据的介绍 /2
1.2 Apache Spark能做什么 /3
1.3 其他分布式数据处理框架 /4
1.4 如何使用本书 /4
∣1.4.1 需要提前具备的基础 /4
∣1.4.2 准备相关开发环境 /4
∣1.4.3 如何学习本书 /5
=
第2章 安装与配置Spark集群 /6
2.1 下载Spark安装包 /6
2.2 检查与准备集群环境 /7
2.3 了解目前集群中已经部署的框架服务 /11
2.4 部署Spark集群 /12
∣2.4.1 实例1:基于Standalone模式部署Spark集群 /12
∣2.4.2 实例2:部署Spark的历史服务——Spark History Server /16
∣2.4.3 实例3:基于Standalone模式部署高可用的Master服务 /18
∣2.4.4 实例4:基于YARN模式部署Spark集群 /20
∣2.4.5 Standalone模式与YARN模式的特点 /22
2.5 本章小结 /23
=
第3章 第1个Spark程序 /24
3.1 运行第1个Spark程序 /24
∣3.1.1 实例5:基于Standalone模式运行第1个Spark程序 /24
∣3.1.2 实例6:基于YARN模式运行第1个Spark程序 /27
∣3.1.3 提交Spark程序时的参数规范 /30
3.2 使用spark-shell编写并运行WordCount程序 /30
∣3.2.1 实例7:启动spark-shell /31
∣3.2.2 实例8:在spark-shell中编写WordCount程序 /32
3.3 使用IDEA编写并运行WordCount程序 /34
∣3.3.1 实例9:准备开发环境,并构建代码工程 /34
∣3.3.2 实例10:使用IDEA编写WordCount程序 /41
∣3.3.3 实例11:在IDEA中本地运行WordCount程序 /44
∣3.3.4 实例12:在IDEA中远程运行WordCount程序 /46
∣3.3.5 实例13:打包程序并提交至集群运行 /48
3.4 本章小结 /49
∣
==第2篇 入门
∣
第4章 读写分布式数据——基于Spark Core /52
4.1 RDD的诞生 /52
4.2 进一步理解RDD /53
∣4.2.1 数据存储 /53
∣4.2.2 数据分析 /55
∣4.2.3 程序调度 /56
4.3 读取数据并生成RDD /57
∣4.3.1 实例14:读取普通文本数据 /58
∣4.3.2 实例15:读取JSON格式的数据 /59
∣4.3.3 实例16:读取CSV、TSV格式的数据 /61
∣4.3.4 实例17:读取SequenceFile格式的数据 /62
∣4.3.5 实例18:读取Object格式的数据 /64
∣4.3.6 实例19:读取HDFS中的数据——显式调用Hadoop API /66
∣4.3.7 实例20:读取MySQL数据库中的数据 /68
4.4 保存RDD中的数据到外部存储系统 /70
∣4.4.1 实例21:保存成普通文本文件 /70
∣4.4.2 实例22:保存成JSON文件 /71
∣4.4.3 实例23:保存成CSV、TSV文件 /73
∣4.4.4 实例24:保存成SequenceFile文件 /74
∣4.4.5 实例25:保存成Object文件 /75
∣4.4.6 实例26:保存成HDFS文件——显式调用Hadoop API的方式 /76
∣4.4.7 实例27:写入MySQL数据库 /78
4.5 本章小结 /80
=
第5章 处理分布式数据——基于Spark Core /81
5.1 RDD的转换(transformations)操作——转换数据形态 /81
∣5.1.1 实例28:基础转换操作 /81
∣5.1.2 实例29:键值对转换操作 /103
5.2 RDD的行动(actions)操作——触发执行任务计划 /115
∣5.2.1 实例30:基础行动操作 /116
∣5.2.2 实例31:键值对行动操作 /125
∣5.2.3 实例32:数值行动操作 /127
5.3 本章小结 /128
∣
==第3篇 进阶
∣
第6章 RDD的高级操作 /130
6.1 缓存RDD /130
∣6.1.1 缓存RDD的基础知识 /130
∣6.1.2 实例33:缓存与释放RDD /133
6.2 RDD的检查点(Checkpoint)机制 /139
∣6.2.1 了解Checkpoint机制 /139
∣6.2.2 实例34:使用Checkpoint机制 /141
∣6.2.3 Checkpoint机制的工作流程 /144
6.3 RDD的依赖关系 /145
∣6.3.1 窄依赖(narrow dependencies) /145
∣6.3.2 宽依赖(wide/shuffle dependencies) /148
∣6.3.3 实例35:让子RDD混合依赖多个父RDD /151
∣6.3.4 实例36:词频统计——总结运算过程中涉及的概念 /153
6.4 累加器(Accumulator) /155
∣6.4.1 认识累加器 /155
∣6.4.2 实例37:使用系统累加器1——长整数、双精度浮点数累加器 /156
∣6.4.3 实例38:使用系统累加器2——集合累加器 /159
∣6.4.4 实例39:自定义累加器 /160
6.5 广播(Broadcast)——将数据块缓存到所有节点 /164
∣6.5.1 认识广播 /165
∣6.5.2 实例40:使用广播补全数据 /165
6.6 本章小结 /168
=
第7章 用SQL语法分析结构化数据——基于Spark SQL /169
7.1 为什么会产生Spark SQL /169
7.2 认识DataFrame与Dataset数据类型 /170
∣7.2.1 认识DataFrame /170
∣7.2.2 认识Dataset /171
7.3 实例41:通过Dataset、DataFrame分析用户数据 /172
∣7.3.1 用spark-shell编写程序 /172
∣7.3.2 用IDEA编写程序 /175
7.4 不同Spark版本的操作差异 /177
∣7.4.1 认识SQLContext与HiveContext /178
∣7.4.2 认识SparkSession /178
7.5 DataFrame、Dataset的基本操作 /179
∣7.5.1 DSL与SQL的语法风格 /179
∣7.5.2 使用临时视图的注意事项 /181
∣7.5.3 实例42:读取JSON、CSV格式的数据 /183
∣7.5.4 实例43:读取Parquet格式的数据 /185
∣7.5.5 实例44:读取代码中动态生成的数据 /185
∣7.5.6 实例45:读取关系型数据库中的数据 /188
∣7.5.7 实例46:输出Dataset、DataFrame中的数据 /189
∣7.5.8 实例47:RDD、DataFrame、Dataset之间的相互转换 /192
7.6 用户自定义函数 /195
∣7.6.1 实例48:实现“一进一出”的UDF /195
∣7.6.2 实例49:实现“多进一出”的UDAF /198
∣7.6.3 实例50:实现“一进多出”的UDTF /208
7.7 集成Spark SQL与Hive /211
∣7.7.1 已经部署Hive框架 /211
∣7.7.2 尚未部署Hive框架 /215
7.8 本章小结 /215
=
第8章 实时处理流式数据——基于Spark Streaming /216
8.1 为什么会产生Spark Streaming /216
8.2 第1个Spark Streaming程序 /216
∣8.2.1 实例51:用spark-shell编写程序 /216
∣8.2.2 实例52:用IDEA编写程序 /221
8.3 什么是DStream /222
∣8.3.1 认识DStream /222
∣8.3.2 认识DStreamGraph /223
8.4 读取数据到DStream中 /227
∣8.4.1 实例53:读取HDFS文件夹中的数据 /227
∣8.4.2 实例54:读取RDD组成的数据队列 /229
∣8.4.3 实例55:实时读取Flume中的数据 /230
∣8.4.4 实例56:用高阶API实时读取Kafka中的数据 /235
∣8.4.5 实例57:用低阶API实时读取Kafka中的数据 /242
8.5 Spark Streaming中的几个时间概念 /251
∣8.5.1 批处理间隔 /251
∣8.5.2 窗口时间宽度与滑动时间宽度 /252
∣8.5.3 实例58:使用窗口操作,每两秒统计10秒内的平均温度 /254
8.6 DStream的操作总结 /259
∣8.6.1 DStream的操作说明 /259
∣8.6.2 实例59:直接面向DStream中的RDD进行数据分析 /261
∣8.6.3 实例60:将DStream中的数据实时输出至外部存储系统 /263
∣8.6.4 实例61:对Dstream进行join操作 /267
8.7 DStream中的转换分类 /269
∣8.7.1 无状态转换 /269
∣8.7.2 有状态转换 /270
∣8.7.3 实例62:用有状态转换做全局词频统计 /270
8.8 在Spark Streaming中的缓存与Checkpoint /272
∣8.8.1 认识Spark Streaming中的Checkpoint /273
∣8.8.2 实例63:使用Spark Streaming中的Checkpoint /273
8.9 Spark Streaming中的累加器与广播变量 /276
∣8.9.1 认识累加器与广播变量 /276
∣8.9.2 实例64:自定义累加器,并结合无状态转换,实现实时的全局词频统计 /276
8.10 关闭Spark Streaming程序 /280
∣8.10.1 关闭程序的方案 /281
∣8.10.2 合理关闭一个运行中的Spark Streaming程序 /281
8.11 本章小结 /284
==
第4篇 高阶
=
第9章 实时处理流式数据——基于Structured Streaming /286
9.1 为什么会产生Structured Streaming /286
9.2 第1个Structured Streaming程序 /287
∣9.2.1 实例65:用spark-shell编写程序 /287
∣9.2.2 实例66:用IDEA编写程序 /289
9.3 Structured Streaming的编程模型 /291
9.4 输入数据——生成Streaming Dataset、Streaming DataFrame /292
∣9.4.1 实例67:根据文件生成工作流 /292
∣9.4.2 实例68:根据文件、文件夹生成自动分区的工作流 /295
∣9.4.3 实例69:根据Kafka以Streaming模式生成工作流 /297
∣9.4.4 实例70:以Kafka为数据源,通过Batch模式生成工作流 /300
∣9.4.5 实例71:根据指定速率生成工作流 /304
9.5 基于事件时间的窗口操作 /305
∣9.5.1 事件时间窗口的工作方式 /305
∣9.5.2 实例72:事件时间窗口的生成规则 /307
∣9.5.3 实例73:基于事件时间窗口实现词频统计 /311
9.6 基于Watermark处理延迟数据 /314
∣9.6.1 Watermark的作用 /314
∣9.6.2 实例74:基于Update模式实现词频统计,并结合Watermark处理延迟数据 /314
∣9.6.3 实例75:基于Append模式实现词频统计,并结合Watermark处理延迟数据 /320
∣9.6.4 Watermark的底层工作原理 /322
∣9.6.5 总结:Watermark机制与输出模式 /329
9.7 实例76:在处理流式数据时去除重复数据 /330
9.8 Structured Streaming中的join操作 /332
∣9.8.1 实例77:在Stream-Static模式下的inner join操作 /333
∣9.8.2 实例78:在Stream-Stream模式下的inner join操作 /335
∣9.8.3 总结:已经支持的join操作 /340
9.9 在Structured Streaming中实现数据分组,并手动维护分组状态 /341
∣9.9.1 实例79:通过mapGroupsWithState实现数据分组,并手动维护分组状态 /341
∣9.9.2 实例80:通过flatMapGroupsWithState实现数据分组,并手动维护分组状态 /347
∣9.9.3 总结:手动维护状态与Watermark的使用技巧 /352
9.10 输出分析结果 /353
∣9.10.1 输出模式(Output Mode)的使用场景 /353
∣9.10.2 实例81:基于File Sink输出数据 /354
∣9.10.3 实例82:基于Kafka Sink,以Streaming方式输出数据 /356
∣9.10.4 实例83:基于Kafka Sink,以Batch方式输出数据 /358
∣9.10.5 实例84:基于Console Sink输出数据 /360
∣9.10.6 实例85:基于Memory Sink输出数据 /360
∣9.10.7 实例86:基于Foreach Sink输出数据 /362
∣9.10.8 实例87:基于ForeachBatch Sink输出数据 /367
∣9.10.9 总结:不同Sink所适用的输出模式 /369
9.11 Trigger触发器的分类 /370
9.12 管理与监控工作流 /370
∣9.12.1 管理工作流 /370
∣9.12.2 监控工作流 /372
9.13 Structured Streaming中的Checkpoint机制 /372
9.14 连续处理模式——Continuous Processing /373
9.15 本章小结 /374
=
第10章 Spark的相关优化 /375
10.1 优化Spark程序 /375
∣10.1.1 实例88:尽可能减少或避免出现Shuffle过程 /375
∣10.1.2 实例89:使用Kryo作为序列化方案 /377
∣10.1.3 尽可能批量操作数据 /381
∣10.1.4 合理设置分区数 /381
∣10.1.5 合理设置批处理间隔 /381
10.2 优化数据 /382
∣10.2.1 关于数据倾斜 /382
∣10.2.2 实例90:使用自定义Partitioner缓解数据倾斜 /383
∣10.2.3 关于数据补全 /387
10.3 调优资源 /388
10.4 本章小结 /390
=
第5篇 商业项目实战
=
第11章 实战:学生学习情况分析系统 /392
11.1 项目概述 /392
∣11.1.1 业务背景 /392
∣11.1.2 划分业务模块 /392
11.2 开发环境说明 /393
11.3 项目实现 /394
∣11.3.1 构建工程 /394
∣11.3.2 模拟数据 /395
∣11.3.3 实时发送数据到Kafka /399
∣11.3.4 实时分析平台答题数据 /402
∣11.3.5 构建推荐模型 /405
∣11.3.6 实时推荐题目 /411
∣11.3.7 离线分析学习情况 /415
11.4 本章小结 /422
∣
=第1章 认识大数据和Spark /2
1.1 大数据的介绍 /2
1.2 Apache Spark能做什么 /3
1.3 其他分布式数据处理框架 /4
1.4 如何使用本书 /4
∣1.4.1 需要提前具备的基础 /4
∣1.4.2 准备相关开发环境 /4
∣1.4.3 如何学习本书 /5
=
第2章 安装与配置Spark集群 /6
2.1 下载Spark安装包 /6
2.2 检查与准备集群环境 /7
2.3 了解目前集群中已经部署的框架服务 /11
2.4 部署Spark集群 /12
∣2.4.1 实例1:基于Standalone模式部署Spark集群 /12
∣2.4.2 实例2:部署Spark的历史服务——Spark History Server /16
∣2.4.3 实例3:基于Standalone模式部署高可用的Master服务 /18
∣2.4.4 实例4:基于YARN模式部署Spark集群 /20
∣2.4.5 Standalone模式与YARN模式的特点 /22
2.5 本章小结 /23
=
第3章 第1个Spark程序 /24
3.1 运行第1个Spark程序 /24
∣3.1.1 实例5:基于Standalone模式运行第1个Spark程序 /24
∣3.1.2 实例6:基于YARN模式运行第1个Spark程序 /27
∣3.1.3 提交Spark程序时的参数规范 /30
3.2 使用spark-shell编写并运行WordCount程序 /30
∣3.2.1 实例7:启动spark-shell /31
∣3.2.2 实例8:在spark-shell中编写WordCount程序 /32
3.3 使用IDEA编写并运行WordCount程序 /34
∣3.3.1 实例9:准备开发环境,并构建代码工程 /34
∣3.3.2 实例10:使用IDEA编写WordCount程序 /41
∣3.3.3 实例11:在IDEA中本地运行WordCount程序 /44
∣3.3.4 实例12:在IDEA中远程运行WordCount程序 /46
∣3.3.5 实例13:打包程序并提交至集群运行 /48
3.4 本章小结 /49
∣
==第2篇 入门
∣
第4章 读写分布式数据——基于Spark Core /52
4.1 RDD的诞生 /52
4.2 进一步理解RDD /53
∣4.2.1 数据存储 /53
∣4.2.2 数据分析 /55
∣4.2.3 程序调度 /56
4.3 读取数据并生成RDD /57
∣4.3.1 实例14:读取普通文本数据 /58
∣4.3.2 实例15:读取JSON格式的数据 /59
∣4.3.3 实例16:读取CSV、TSV格式的数据 /61
∣4.3.4 实例17:读取SequenceFile格式的数据 /62
∣4.3.5 实例18:读取Object格式的数据 /64
∣4.3.6 实例19:读取HDFS中的数据——显式调用Hadoop API /66
∣4.3.7 实例20:读取MySQL数据库中的数据 /68
4.4 保存RDD中的数据到外部存储系统 /70
∣4.4.1 实例21:保存成普通文本文件 /70
∣4.4.2 实例22:保存成JSON文件 /71
∣4.4.3 实例23:保存成CSV、TSV文件 /73
∣4.4.4 实例24:保存成SequenceFile文件 /74
∣4.4.5 实例25:保存成Object文件 /75
∣4.4.6 实例26:保存成HDFS文件——显式调用Hadoop API的方式 /76
∣4.4.7 实例27:写入MySQL数据库 /78
4.5 本章小结 /80
=
第5章 处理分布式数据——基于Spark Core /81
5.1 RDD的转换(transformations)操作——转换数据形态 /81
∣5.1.1 实例28:基础转换操作 /81
∣5.1.2 实例29:键值对转换操作 /103
5.2 RDD的行动(actions)操作——触发执行任务计划 /115
∣5.2.1 实例30:基础行动操作 /116
∣5.2.2 实例31:键值对行动操作 /125
∣5.2.3 实例32:数值行动操作 /127
5.3 本章小结 /128
∣
==第3篇 进阶
∣
第6章 RDD的高级操作 /130
6.1 缓存RDD /130
∣6.1.1 缓存RDD的基础知识 /130
∣6.1.2 实例33:缓存与释放RDD /133
6.2 RDD的检查点(Checkpoint)机制 /139
∣6.2.1 了解Checkpoint机制 /139
∣6.2.2 实例34:使用Checkpoint机制 /141
∣6.2.3 Checkpoint机制的工作流程 /144
6.3 RDD的依赖关系 /145
∣6.3.1 窄依赖(narrow dependencies) /145
∣6.3.2 宽依赖(wide/shuffle dependencies) /148
∣6.3.3 实例35:让子RDD混合依赖多个父RDD /151
∣6.3.4 实例36:词频统计——总结运算过程中涉及的概念 /153
6.4 累加器(Accumulator) /155
∣6.4.1 认识累加器 /155
∣6.4.2 实例37:使用系统累加器1——长整数、双精度浮点数累加器 /156
∣6.4.3 实例38:使用系统累加器2——集合累加器 /159
∣6.4.4 实例39:自定义累加器 /160
6.5 广播(Broadcast)——将数据块缓存到所有节点 /164
∣6.5.1 认识广播 /165
∣6.5.2 实例40:使用广播补全数据 /165
6.6 本章小结 /168
=
第7章 用SQL语法分析结构化数据——基于Spark SQL /169
7.1 为什么会产生Spark SQL /169
7.2 认识DataFrame与Dataset数据类型 /170
∣7.2.1 认识DataFrame /170
∣7.2.2 认识Dataset /171
7.3 实例41:通过Dataset、DataFrame分析用户数据 /172
∣7.3.1 用spark-shell编写程序 /172
∣7.3.2 用IDEA编写程序 /175
7.4 不同Spark版本的操作差异 /177
∣7.4.1 认识SQLContext与HiveContext /178
∣7.4.2 认识SparkSession /178
7.5 DataFrame、Dataset的基本操作 /179
∣7.5.1 DSL与SQL的语法风格 /179
∣7.5.2 使用临时视图的注意事项 /181
∣7.5.3 实例42:读取JSON、CSV格式的数据 /183
∣7.5.4 实例43:读取Parquet格式的数据 /185
∣7.5.5 实例44:读取代码中动态生成的数据 /185
∣7.5.6 实例45:读取关系型数据库中的数据 /188
∣7.5.7 实例46:输出Dataset、DataFrame中的数据 /189
∣7.5.8 实例47:RDD、DataFrame、Dataset之间的相互转换 /192
7.6 用户自定义函数 /195
∣7.6.1 实例48:实现“一进一出”的UDF /195
∣7.6.2 实例49:实现“多进一出”的UDAF /198
∣7.6.3 实例50:实现“一进多出”的UDTF /208
7.7 集成Spark SQL与Hive /211
∣7.7.1 已经部署Hive框架 /211
∣7.7.2 尚未部署Hive框架 /215
7.8 本章小结 /215
=
第8章 实时处理流式数据——基于Spark Streaming /216
8.1 为什么会产生Spark Streaming /216
8.2 第1个Spark Streaming程序 /216
∣8.2.1 实例51:用spark-shell编写程序 /216
∣8.2.2 实例52:用IDEA编写程序 /221
8.3 什么是DStream /222
∣8.3.1 认识DStream /222
∣8.3.2 认识DStreamGraph /223
8.4 读取数据到DStream中 /227
∣8.4.1 实例53:读取HDFS文件夹中的数据 /227
∣8.4.2 实例54:读取RDD组成的数据队列 /229
∣8.4.3 实例55:实时读取Flume中的数据 /230
∣8.4.4 实例56:用高阶API实时读取Kafka中的数据 /235
∣8.4.5 实例57:用低阶API实时读取Kafka中的数据 /242
8.5 Spark Streaming中的几个时间概念 /251
∣8.5.1 批处理间隔 /251
∣8.5.2 窗口时间宽度与滑动时间宽度 /252
∣8.5.3 实例58:使用窗口操作,每两秒统计10秒内的平均温度 /254
8.6 DStream的操作总结 /259
∣8.6.1 DStream的操作说明 /259
∣8.6.2 实例59:直接面向DStream中的RDD进行数据分析 /261
∣8.6.3 实例60:将DStream中的数据实时输出至外部存储系统 /263
∣8.6.4 实例61:对Dstream进行join操作 /267
8.7 DStream中的转换分类 /269
∣8.7.1 无状态转换 /269
∣8.7.2 有状态转换 /270
∣8.7.3 实例62:用有状态转换做全局词频统计 /270
8.8 在Spark Streaming中的缓存与Checkpoint /272
∣8.8.1 认识Spark Streaming中的Checkpoint /273
∣8.8.2 实例63:使用Spark Streaming中的Checkpoint /273
8.9 Spark Streaming中的累加器与广播变量 /276
∣8.9.1 认识累加器与广播变量 /276
∣8.9.2 实例64:自定义累加器,并结合无状态转换,实现实时的全局词频统计 /276
8.10 关闭Spark Streaming程序 /280
∣8.10.1 关闭程序的方案 /281
∣8.10.2 合理关闭一个运行中的Spark Streaming程序 /281
8.11 本章小结 /284
==
第4篇 高阶
=
第9章 实时处理流式数据——基于Structured Streaming /286
9.1 为什么会产生Structured Streaming /286
9.2 第1个Structured Streaming程序 /287
∣9.2.1 实例65:用spark-shell编写程序 /287
∣9.2.2 实例66:用IDEA编写程序 /289
9.3 Structured Streaming的编程模型 /291
9.4 输入数据——生成Streaming Dataset、Streaming DataFrame /292
∣9.4.1 实例67:根据文件生成工作流 /292
∣9.4.2 实例68:根据文件、文件夹生成自动分区的工作流 /295
∣9.4.3 实例69:根据Kafka以Streaming模式生成工作流 /297
∣9.4.4 实例70:以Kafka为数据源,通过Batch模式生成工作流 /300
∣9.4.5 实例71:根据指定速率生成工作流 /304
9.5 基于事件时间的窗口操作 /305
∣9.5.1 事件时间窗口的工作方式 /305
∣9.5.2 实例72:事件时间窗口的生成规则 /307
∣9.5.3 实例73:基于事件时间窗口实现词频统计 /311
9.6 基于Watermark处理延迟数据 /314
∣9.6.1 Watermark的作用 /314
∣9.6.2 实例74:基于Update模式实现词频统计,并结合Watermark处理延迟数据 /314
∣9.6.3 实例75:基于Append模式实现词频统计,并结合Watermark处理延迟数据 /320
∣9.6.4 Watermark的底层工作原理 /322
∣9.6.5 总结:Watermark机制与输出模式 /329
9.7 实例76:在处理流式数据时去除重复数据 /330
9.8 Structured Streaming中的join操作 /332
∣9.8.1 实例77:在Stream-Static模式下的inner join操作 /333
∣9.8.2 实例78:在Stream-Stream模式下的inner join操作 /335
∣9.8.3 总结:已经支持的join操作 /340
9.9 在Structured Streaming中实现数据分组,并手动维护分组状态 /341
∣9.9.1 实例79:通过mapGroupsWithState实现数据分组,并手动维护分组状态 /341
∣9.9.2 实例80:通过flatMapGroupsWithState实现数据分组,并手动维护分组状态 /347
∣9.9.3 总结:手动维护状态与Watermark的使用技巧 /352
9.10 输出分析结果 /353
∣9.10.1 输出模式(Output Mode)的使用场景 /353
∣9.10.2 实例81:基于File Sink输出数据 /354
∣9.10.3 实例82:基于Kafka Sink,以Streaming方式输出数据 /356
∣9.10.4 实例83:基于Kafka Sink,以Batch方式输出数据 /358
∣9.10.5 实例84:基于Console Sink输出数据 /360
∣9.10.6 实例85:基于Memory Sink输出数据 /360
∣9.10.7 实例86:基于Foreach Sink输出数据 /362
∣9.10.8 实例87:基于ForeachBatch Sink输出数据 /367
∣9.10.9 总结:不同Sink所适用的输出模式 /369
9.11 Trigger触发器的分类 /370
9.12 管理与监控工作流 /370
∣9.12.1 管理工作流 /370
∣9.12.2 监控工作流 /372
9.13 Structured Streaming中的Checkpoint机制 /372
9.14 连续处理模式——Continuous Processing /373
9.15 本章小结 /374
=
第10章 Spark的相关优化 /375
10.1 优化Spark程序 /375
∣10.1.1 实例88:尽可能减少或避免出现Shuffle过程 /375
∣10.1.2 实例89:使用Kryo作为序列化方案 /377
∣10.1.3 尽可能批量操作数据 /381
∣10.1.4 合理设置分区数 /381
∣10.1.5 合理设置批处理间隔 /381
10.2 优化数据 /382
∣10.2.1 关于数据倾斜 /382
∣10.2.2 实例90:使用自定义Partitioner缓解数据倾斜 /383
∣10.2.3 关于数据补全 /387
10.3 调优资源 /388
10.4 本章小结 /390
=
第5篇 商业项目实战
=
第11章 实战:学生学习情况分析系统 /392
11.1 项目概述 /392
∣11.1.1 业务背景 /392
∣11.1.2 划分业务模块 /392
11.2 开发环境说明 /393
11.3 项目实现 /394
∣11.3.1 构建工程 /394
∣11.3.2 模拟数据 /395
∣11.3.3 实时发送数据到Kafka /399
∣11.3.4 实时分析平台答题数据 /402
∣11.3.5 构建推荐模型 /405
∣11.3.6 实时推荐题目 /411
∣11.3.7 离线分析学习情况 /415
11.4 本章小结 /422