第1部分 第1步 3
第1章 Apache Spark简介 3
1.1 什么是Spark 4
1.1.1 Spark革命 4
1.1.2 MapReduce的缺点 5
1.1.3 Spark带来了什么有价值的东西 5
1.2 Spark组件 7
1.2.1 Spark Core 7
1.2.2 Spark SQL 8
1.2.3 Spark Streaming 9
1.2.4 Spark MLlib 9
1.2.5 Spark GraphX 9
1.3 Spark程序流程 9
1.4 Spark生态系统 12
1.5 设置spark-in-action VM 13
1.5.1 下载和启动虚拟机 13
1.5.2 关闭虚拟机 14
1.6 总结 15
第2章 Spark基础 16
2.1 使用spark-in-action VM 17
2.1.1 复制Spark in Action GitHub存储库 17
2.1.2 找到Java 17
2.1.3 使用虚拟机的Hadoop安装 18
2.1.4 检查虚拟机的Spark安装 19
2.2 用Spark shell编写第一个Spark程序 20
2.2.1 启动Spark shell 20
2.2.2 第一个Spark代码示例 22
2.2.3 弹性分布式数据集的概念 24
2.3 基本RDD行动和转换操作 24
2.3.1 使用map转换 25
2.3.2 使用distinct和flatMap转换 27
2.3.3 使用sample、 take和takeSample操作获取RDD的元素 30
2.4 Double RDD函数 32
2.4.1 Double RDD函数基础统计 33
2.4.2 使用直方图可视化数据分布 34
2.4.3 近似总和与平均 34
2.5 总结 35
第3章 编写Spark应用程序 36
3.1 在Eclipse中生成一个新的Spark项目 36
3.2 开发应用程序 41
3.2.1 准备GitHub归档数据集 41
3.2.2 加载JSON 43
3.2.3 使用Eclipse运行应用程序 45
3.2.4 数据汇总 47
3.2.5 排除非公司员工 48
3.2.6 广播变量 49
3.2.7 使用整个数据集 52
3.3 提交应用程序 53
3.3.1 构建uberjar 53
3.3.2 调整应用程序 54
3.3.3 使用spark-submit 56
3.4 总结 58
第4章 深入Spark API 60
4.1 使用键值对RDD 60
4.1.1 创建键值对RDD 61
4.1.2 键值对RDD的基本功能 61
4.2 了解数据分区和减少数据混排 66
4.2.1 使用Spark数据分区器 67
4.2.2 了解和避免不必要的混排 68
4.2.3 RDD重新分区 71
4.2.4 在分区中映射数据 72
4.3 连接、排序、分组数据 73
4.3.1 连接数据 74
4.3.2 数据排序 79
4.3.3 数据分组 82
4.4 理解RDD依赖 84
4.4.1 RDD依赖和Spark执行 84
4.4.2 Spark阶段和任务 86
4.4.3 使用检查节点保存Spark谱系 87
4.5 使用累加器和广播变量与Spark执行器进行通信 87
4.5.1 使用累加器从执行器获取数据 87
4.5.2 使用广播变量将数据发送到执行器 89
4.6 总结 90
第2部分 认识Spark家族 95
第5章 使用Spark SQL执行Spark查询 95
5.1 使用DataFrame 96
5.1.1 从RDD创建DataFrame 98
5.1.2 DataFrame API基础知识 105
5.1.3 使用SQL函数执行数据计算 107
5.1.4 使用缺失值 112
5.1.5 将DataFrame转换为RDD 113
5.1.6 分组和连接数据 113
5.1.7 执行连接 117
5.2 超越DataFrame:引入DataSet 118
5.3 使用SQL命令 119
5.3.1 表目录和Hive metastore 119
5.3.2 执行SQL查询 122
5.3.3 通过Thrift服务器连接到Spark SQL 123
5.4 保存并加载DataFrame数据 125
5.4.1 内置数据源 126
5.4.2 保存数据 126
5.4.3 加载数据 128
5.5 Catalyst优化器 129
5.6 Tungsten的性能改进 131
5.7 总结 132
第6章 使用Spark Streaming提取数据 133
6.1 编写Spark Streaming应用程序 134
6.1.1 介绍示例应用程序 134
6.1.2 创建流上下文 135
6.1.3 创建离散流 136
6.1.4 使用离散流 137
6.1.5 将结果保存到文件 138
6.1.6 启动和停止流计算 139
6.1.7 随时保存计算状态 140
6.1.8 使用窗口操作进行限时计算 146
6.1.9 检查其他内置输入流 148
6.2 使用外部数据源 149
6.2.1 设置Kafka 149
6.2.2 使用Kafka更改流应用程序 150
6.3 Spark Streaming作业的性能 156
6.3.1 获得良好的性能 157
6.3.2 实现容错 158
6.4 结构化流 159
6.4.1 创建流式DataFrame 160
6.4.2 输出流数据 160
6.4.3 检查流执行 161
6.4.4 结构化流的未来方向 161
6.5 总结 162
第7章 使用MLlib变得更智能 163
7.1 机器学习简介 164
7.1.1 机器学习的定义 166
7.1.2 机器学习算法的分类 166
7.1.3 使用Spark进行机器学习 168
7.2 Spark中的线性代数 169
7.2.1 本地向量和矩阵实现 169
7.2.2 分布式矩阵 173
7.3 线性回归 174
7.3.1 关于线性回归 174
7.3.2 简单线性回归 174
7.3.3 将模型扩展到多元线性回归 176
7.4 分析和准备数据 178
7.4.1 分析数据分布 178
7.4.2 分析列余弦相似性 179
7.4.3 计算协方差矩阵 179
7.4.4 转换为标记点 180
7.4.5 拆分数据 180
7.4.6 特征缩放和均值归一化 181
7.5 拟合和使用线性回归模型 181
7.5.1 预测目标值 182
7.5.2 评估模型的性能 182
7.5.3 解释模型参数 183
7.5.4 加载和保存模型 183
7.6 调整算法 184
7.6.1 找到正确的步长和迭代次数 184
7.6.2 添加高阶多项式 186
7.6.3 偏差-方差权衡和模型复杂度 187
7.6.4 绘制残差图 189
7.6.5 使用正则化避免过度拟合 190
7.6.6 k折交叉验证 191
7.7 优化线性回归 192
7.7.1 小批量随机梯度下降 192
7.7.2 LBFGS优化器 193
7.8 总结 194
第8章 ML:分类和聚类 195
8.1 Spark ML库 196
8.1.1 估计器、转换器和评估器 196
8.1.2 ML参数 196
8.1.3 ML管道 197
8.2 逻辑回归 197
8.2.1 二元逻辑回归模型 198
8.2.2 准备数据以使用Spark中的逻辑回归 199
8.2.3 训练模型 204
8.2.4 评估分类模型 205
8.2.5 执行k折交叉验证 208
8.2.6 多类逻辑回归 210
8.3 决策树和随机森林 212
8.3.1 决策树 213
8.3.2 随机森林 217
8.4 使用k-均值聚类 219
8.4.1 k-均值聚类 220
8.5 总结 224
第9章 使用GraphX连接点 226
9.1 Spark图形处理 226
9.1.1 使用GraphX API构建图 227
9.1.2 转换图 228
9.2 图算法 233
9.2.1 数据集的介绍 234
9.2.2 最短路径算法 235
9.2.3 页面排名 236
9.2.4 连通分量 236
9.2.5 强连通分量 237
9.3 实现A*搜索算法 239
9.3.1 了解A*算法 239
9.3.2 实现A*算法 241
9.3.3 测试的实施 248
9.4 总结 249
第3部分 Spark ops 253
第10章 运行Spark 253
10.1 Spark运行时体系结构概述 253
10.1.1 Spark运行时组件 254
10.1.2 Spark集群类型 256
10.2 作业和资源调度 257
10.2.1 集群资源调度 257
10.2.2 Spark作业调度 257
10.2.3 数据局部性的考虑 259
10.2.4 Spark内存调度 260
10.3 配置Spark 261
10.3.1 Spark配置文件 261
10.3.2 命令行参数 261
10.3.3 系统环境变量 262
10.3.4 以编程方式设置配置 262
10.3.5 master参数 262
10.3.6 查看所有已配置的参数 263
10.4 Spark Web UI 263
10.4.1 Jobs(作业)页面 264
10.4.2 Stages(阶段)页面 264
10.4.3 Storage(存储)页面 267
10.4.4 Environment(环境)页面 267
10.4.5 Executors(执行器)页面 268
10.5 在本地机器上运行Spark 269
10.5.1 本地模式 269
10.5.2 本地集群模式 270
10.6 总结 270
第11章 在Spark standalone集群上运行 272
11.1 Spark standalone集群组件 272
11.2 启动standalone集群 274
11.2.1 使用shell脚本启动集群 274
11.2.2 手动启动集群 276
11.2.3 查看Spark进程 277
11.2.4 Standalone master高可用性和恢复性 277
11.3 Standalone集群Web UI 279
11.4 在standalone集群中运行应用程序 281
11.4.1 驱动器的位置 281
11.4.2 指定执行器的数量 282
11.4.3 指定额外的类路径和文件 282
11.4.4 终止应用程序 284
11.4.5 应用程序自动重启 284
11.5 Spark历史服务器和事件日志记录 284
11.6 在Amazon EC2上运行 285
11.6.1 先决条件 286
11.6.2 创建一个EC2 standalone集群 287
11.6.3 使用EC2集群 289
11.6.4 销毁集群 291
11.7 总结 292
第12章 在YARN和Mesos上运行 293
12.1 在YARN上运行Spark 293
12.1.1 YARN架构 294
12.1.2 安装配置启动YARN 294
12.1.3 YARN中的资源调度 296
12.1.4 向YARN提交Spark应用程序 297
12.1.5 在YARN上配置Spark 299
12.1.6 为Spark工作配置资源 300
12.1.7 YARN UI 301
12.1.8 在YARN上寻找日志 303
12.1.9 安全注意事项 304
12.1.10 动态资源分配 304
12.2 在Mesos上运行Spark 305
12.2.1 Mesos架构 306
12.2.2 安装配置Mesos 309
12.2.3 Mesos Web UI 310
12.2.4 Mesos资源调度 312
12.2.5 向Mesos提交Spark应用程序 313
12.2.6 使用 Docker运行Spark 314
12.3 总结 317
第4部分 协同使用 321
第13章 实例学习:实时仪表盘 321
13.1 了解用例 321
13.1.1 概况 321
13.1.2 了解应用程序组件 323
13.2 运行应用程序 324
13.2.1 在spark-in-action VM中运行应用程序 325
13.2.2 手动启动程序 328
13.3 理解源代码 330
13.3.1 KafkaLogsSimulator项目 330
13.3.2 StreamingLogAnalyzer项目 331
13.3.3 WebStatsDashboard项目 337
13.3.4 构建项目 337
13.4 总结 338
第14章 用H2O深入学习Spark 339
14.1 什么是深度学习 339
14.2 在Spark中使用H2O 341
14.2.1 什么是H2O 341
14.2.2 在Spark中启动Sparkling Water 342
14.2.3 启动H2O集群 344
14.2.4 访问Flow UI 344
14.3 使用H2O的深度学习进行回归 346
14.3.1 将数据加载到 H2O框架 346
14.3.2 使用Flow UI构建和评估深度学习模型 349
14.3.3 使用Sparkling Water API构建和评估深度学习模型 352
14.4 使用H2O的深度学习进行分类 357
14.4.1 加载和拆分数据 357
14.4.2 通过Flow UI构建模型 358
14.4.3 使用Sparkling Water API构建模型 361
14.4.4 停止H2O集群 362
14.5 总结 362
附录 363
附录A 安装Apache Spark 363
附录B 了解MapReduce 368
附录C 线性代数入门 370