第1章 RDD功能解析 1
1.1 RDD产生的技术背景及功能 1
1.2 RDD的基本概念 2
1.2.1 RDD的定义 2
1.2.2 RDD五大特性 5
1.2.3 RDD弹性特性的7个方面 7
1.3 创建RDD的方式 13
1.3.1 通过已经存在的Scala集合创建RDD 13
1.3.2 通过HDFS和本地文件系统创建RDD 13
1.3.3 其他的RDD的转换 14
1.3.4 其他的RDD的创建 20
1.4 RDD算子 21
1.5 RDD的Transformation算子 24
1.5.1 Transformation的定义 24
1.5.2 Transformation在RDD中的角色定位及功能 24
1.5.3 Transformation操作的Lazy特性 24
1.5.4 通过实践说明Transformation的Lazy特性 25
1.6 RDD的Action算子 25
1.6.1 Action的定义 25
1.6.2 Action在RDD中的角色定位及功能 25
1.7 小结 27
第2章 RDD的运行机制 28
2.1 RDD依赖关系 28
2.1.1 窄依赖(Narrow Dependency) 28
2.1.2 宽依赖(Shuffle Dependency) 30
2.2 有向无环图(Directed Acyclic Graph,DAG) 31
2.2.1 什么是DAG 31
2.2.2 DAG的生成机制 32
2.2.3 DAG的逻辑视图 33
2.3 RDD内部的计算机制 34
2.3.1 RDD的计算任务(Task) 34
2.3.2 RDD的计算过程 35
2.4 RDD中缓存的适用场景和工作机制 41
2.4.1 缓存的使用 41
2.4.2 缓存的适用场景 42
2.4.3 缓存工作机制解析 43
2.5 RDD的检查点(Checkpoint)的适用场景和工作机制 45
2.5.1 Checkpoint的触发 45
2.5.2 Checkpoint的适用场景 46
2.5.3 Checkpoint工作机制解析 46
2.6 RDD容错原理及其四大核心要点 49
2.6.1 RDD容错原理 49
2.6.2 RDD容错的四大核心要点 49
2.7 通过WordCount实践RDD内部机制 51
2.7.1 WordCount案例实践 51
2.7.2 解析RDD生成的内部机制 53
2.8 小结 54
第3章 部署模式(Deploy)解析 55
3.1 部署模式概述 55
3.2 应用程序的部署 55
3.2.1 应用程序部署的脚本解析 55
3.2.2 应用程序部署的源代码解析 58
3.3 Local与Local-Cluster部署 69
3.3.1 Local部署 70
3.3.2 Local[*]与Local[N]部署 70
3.3.3 Local[*,M]与Local[N,M]部署 70
3.3.4 Local-Cluster[S,C,M]部署 72
3.4 Spark Standalone部署 72
3.4.1 部署框架 72
3.4.2 应用程序的部署 73
3.4.3 Master的部署 84
3.4.4 Worker的部署 98
3.4.5 内部交互的消息机制 108
3.4.6 Master HA的部署 110
3.5 Spark on YARN的部署模型 115
3.5.1 部署框架 115
3.5.2 应用程序的部署 118
3.6 小结 124
第4章 Spark调度器(Scheduler)运行机制 125
4.1 Spark运行的核心概念 125
4.1.1 Spark运行的基本对象 125
4.1.2 Spark运行框架及各组件的基本运行原理 126
4.2 Spark Driver Program剖析 127
4.2.1 什么是Spark Driver Program 127
4.2.2 SparkContext原理剖析 128
4.2.3 SparkContext源代码解析 129
4.3 Spark Job的触发 134
4.3.1 Job的逻辑执行(General Logical Plan) 134
4.3.2 Job具体的物理执行 135
4.3.3 Job触发流程源代码解析 138
4.4 高层的DAG调度器(DAGScheduler) 140
4.4.1 DAG的定义 140
4.4.2 DAG的实例化 140
4.4.3 DAGScheduer划分Stage的原理 142
4.4.4 DAGScheduer划分Stage的具体算法 143
4.4.5 Stage内部Task获取最佳位置的算法 148
4.5 底层的Task调度器(TaskScheduler) 150
4.5.1 TaskScheduer原理剖析 151
4.5.2 TaskScheduer源代码解析 152
4.6 调度器的通信终端(SchedulerBackend) 157
4.6.1 SchedulerBackend原理 157
4.6.2 SchedulerBackend源代码解析 158
4.6.3 Spark程序的注册机制 160
4.6.4 Spark程序对计算资源Executor的管理 163
4.7 小结 167
第5章 执行器(Executor) 168
5.1 Executor的创建、分配、启动及异常处理 169
5.1.1 Executor的创建 169
5.1.2 Executor的资源分配 177
5.1.3 Executor的启动 183
5.1.4 Executor的异常处理 188
5.2 执行器的通信接口(ExecutorBackend) 190
5.2.1 ExecutorBackend接口与Executor的关系 190
5.2.2 ExecutorBackend的不同实现 191
5.2.3 ExecutorBackend中的通信 194
5.3 执行器(Executor)中任务的执行 198
5.3.1 Executor中任务的加载 198
5.3.2 Executor中的任务线程池 199
5.3.3 任务执行失败处理 199
5.3.4 剖析TaskRunner 201
5.4 小结 202
第6章 Spark的存储模块(Storage) 203
6.1 Storage概述 203
6.1.1 Storage的概念 203
6.1.2 Storage的设计模式 204
6.2 Storage模块整体架构 204
6.2.1 通信层 205
6.2.2 存储层 208
6.2.3 Partition与Block的对应关系 235
6.3 不同Storage Level对比 236
6.4 Executor内存模型 237
6.5 Tachyon 239
6.5.1 Tachyon简介 239
6.5.2 Tachyon API的使用 240
6.5.3 Tachyon在Spark中的使用 242
6.6 小结 245
第7章 Shuffle机制 246
7.1 Shuffle概述 246
7.2 Shuffle的框架 248
7.2.1 Shuffle的框架演进 248
7.2.2 Shuffle的框架内核 249
7.2.3 Shuffle框架的源代码解析 250
7.2.4 Shuffle的注册 254
7.2.5 Shuffle读写数据的源代码解析 255
7.3 基于Hash的Shuffle 261
7.3.1 基于Hash的Shuffle内核 261
7.3.2 基于Hash的Shuffle写数据的源代码解析 265
7.4 基于Sort的Shuffle 270
7.4.1 基于Sort的Shuffle内核 271
7.4.2 基于Sort的Shuffle写数据的源代码解析 273
7.5 基于Tungsten Sort的Shuffle 279
7.5.1 基于Tungsten Sort的Shuffle内核 279
7.5.2 基于Tungsten Sort的Shuffle写数据的源代码解析 281
7.6 小结 286
第8章 钨丝计划(Project Tungsten) 287
8.1 钨丝计划(Project Tungsten)概述 287
8.2 内存管理模型 288
8.2.1 现有内存管理的机制 288
8.2.2 Project Tungsten内存管理的模型及其源代码的解析 290
8.3 基于内存管理模型的Shuffle二进制数据处理 305
8.3.1 插入记录时二进制数据的处理 308
8.3.2 spill时二进制数据的处理 312
8.4 小结 313
第9章 性能优化 314
9.1 Spark的配置机制 314
9.1.1 通过SparkConf配置Spark 314
9.1.2 通过spark-submit配置Spark 315
9.1.3 通过配置文件配置Spark 316
9.1.4 Spark配置机制总结 316
9.2 性能诊断 317
9.2.1 WebUI的8080端口 317
9.2.2 WebUI的18080端口 318
9.2.3 WebUI的4040端口 319
9.2.4 WebUI的Jobs页面 319
9.2.5 WebUI的Stages页面 320
9.2.6 WebUI的Storage页面 321
9.2.7 WebUI的Environment页面 322
9.2.8 WebUI的Executors页面 324
9.2.9 Driver和Executor的日志 324
9.3 性能优化 325
9.3.1 程序编写准则 325
9.3.2 并行度 330
9.3.3 资源参数调优 331
9.3.4 序列化与压缩 332
9.3.5 内存调优 334
9.3.6 广播大变量 336
9.3.7 持久化与checkpoint 337
9.3.8 数据本地性 341
9.3.9 垃圾回收调优 342
9.3.10 Shuffle调优 343
9.4 小结 344