准备篇 2
第1章 环境准备 2
1.1 运行环境准备 2
1.1.1 安装JDK 3
1.1.2 安装Scala 3
1.1.3 安装Spark 4
1.2 Spark初体验 4
1.2.1 运行spark-shell 4
1.2.2 执行word count 5
1.2.3 剖析spark-shell 7
1.3 阅读环境准备 11
1.4 Spark源码编译与调试 13
1.5 小结 17
第2章 Spark设计理念与基本架构 18
2.1 初识Spark 18
2.1.1 Hadoop MRv1的局限 18
2.1.2 Spark使用场景 20
2.1.3 Spark的特点 20
2.2 Spark基础知识 20
2.3 Spark基本设计思想 22
2.3.1 Spark模块设计 22
2.3.2 Spark模型设计 24
2.4 Spark基本架构 25
2.5 小结 26
核心设计篇 28
第3章 SparkContext的初始化 28
3.1 SparkContext概述 28
3.2 创建执行环境SparkEnv 30
3.2.1 安全管理器SecurityManager 31
3.2.2 基于Akka的分布式消息系统ActorSystem 31
3.2.3 map任务输出跟踪器mapOutputTracker 32
3.2.4 实例化ShuffleManager 34
3.2.5 shuffle线程内存管理器ShuffleMemoryManager 34
3.2.6 块传输服务BlockTransferService 35
3.2.7 BlockManagerMaster介绍 35
3.2.8 创建块管理器BlockManager 36
3.2.9 创建广播管理器Broadcast-Manager 36
3.2.10 创建缓存管理器CacheManager 37
3.2.11 HTTP文件服务器HttpFile-Server 37
3.2.12 创建测量系统MetricsSystem 39
3.2.13 创建SparkEnv 40
3.3 创建metadataCleaner 41
3.4 SparkUI详解 42
3.4.1 listenerBus详解 43
3.4.2 构造JobProgressListener 46
3.4.3 SparkUI的创建与初始化 47
3.4.4 Spark UI的页面布局与展示 49
3.4.5 SparkUI的启动 54
3.5 Hadoop相关配置及Executor环境变量 54
3.5.1 Hadoop相关配置信息 54
3.5.2 Executor环境变量 54
3.6 创建任务调度器TaskScheduler 55
3.6.1 创建TaskSchedulerImpl 55
3.6.2 TaskSchedulerImpl的初始化 57
3.7 创建和启动DAGScheduler 57
3.8 TaskScheduler的启动 60
3.8.1 创建LocalActor 60
3.8.2 ExecutorSource的创建与注册 62
3.8.3 ExecutorActor的构建与注册 64
3.8.4 Spark自身ClassLoader的创建 64
3.8.5 启动Executor的心跳线程 66
3.9 启动测量系统MetricsSystem 69
3.9.1 注册Sources 70
3.9.2 注册Sinks 70
3.9.3 给Sinks增加Jetty的Servlet-ContextHandler 71
3.10 创建和启动ExecutorAllocation-Manager 72
3.11 ContextCleaner的创建与启动 73
3.12 Spark环境更新 74
3.13 创建DAGSchedulerSource和BlockManagerSource 76
3.14 将SparkContext标记为激活 77
3.15 小结 78
第4章 存储体系 79
4.1 存储体系概述 79
4.1.1 块管理器BlockManager的实现 79
4.1.2 Spark存储体系架构 81
4.2 shuffle服务与客户端 83
4.2.1 Block的RPC服务 84
4.2.2 构造传输上下文Transpor-tContext 85
4.2.3 RPC客户端工厂Transport-ClientFactory 86
4.2.4 Netty服务器TransportServer 87
4.2.5 获取远程shuffle文件 88
4.2.6 上传shuffle文件 89
4.3 BlockManagerMaster对Block-Manager的管理 90
4.3.1 BlockManagerMasterActor 90
4.3.2 询问Driver并获取回复方法 92
4.3.3 向BlockManagerMaster注册BlockManagerld 93
4.4 磁盘块管理器DiskBlockManager 94
4.4.1 DiskBlockManager的构造过程 94
4.4.2 获取磁盘文件方法getFile 96
4.4.3 创建临时Block方法create-TempShuffleBlock 96
4.5 磁盘存储DiskStore 97
4.5.1 NIO读取方法getBytes 97
4.5.2 NIO写入方法putBytes 98
4.5.3 数组写入方法putArray 98
4.5.4 Iterator写入方法putIterator 98
4.6 内存存储MemoryStore 99
4.6.1 数据存储方法putBytes 101
4.6.2 Iterator写入方法putIterator详解 101
4.6.3 安全展开方法unrollSafely 102
4.6.4 确认空闲内存方法ensureFree-Space 105
4.6.5 内存写入方法putArray 107
4.6.6 尝试写入内存方法tryToPut 108
4.6.7 获取内存数据方法getBytes 109
4.6.8 获取数据方法getValues 110
4.7 Tachyon存储TachyonStore 110
4.7.1 Tachyon简介 111
4.7.2 TachyonStore的使用 112
4.7.3 写入Tachyon内存的方法putIntoTachyonStore 113
4.7.4 获取序列化数据方法getBytes 113
4.8 块管理器BlockManager 114
4.8.1 移出内存方法dropFrom-Memory 114
4.8.2 状态报告方法reportBlockStatus 116
4.8.3 单对象块写入方法putSingle 117
4.8.4 序列化字节块写入方法putBytes 118
4.8.5 数据写入方法doPut 118
4.8.6 数据块备份方法replicate 121
4.8.7 创建DiskBlockObjectWriter的方法getDiskWriter 125
4.8.8 获取本地Block数据方法getBlockData 125
4.8.9 获取本地shuffle数据方法doGetLocal 126
4.8.10 获取远程Block数据方法doGetRemote 127
4.8.11 获取Block数据方法get 128
4.8.12 数据流序列化方法dataSerializeStream 129
4.9 metadataCleaner和broadcast-Cleaner 129
4.10 缓存管理器CacheManager 130
4.11 压缩算法 133
4.12 磁盘写入实现DiskBlockObject-Writer 133
4.13 块索引shuffle管理器Index-ShuffleBlockManager 135
4.14 shuffle内存管理器Shuffle-MemoryManager 137
4.15 小结 138
第5章 任务提交与执行 139
5.1 任务概述 139
5.2 广播Hadoop的配置信息 142
5.3 RDD转换及DAG构建 144
5.3.1 为什么需要RDD 144
5.3.2 RDD实现分析 146
5.4 任务提交 152
5.4.1 任务提交的准备 152
5.4.2 finalStage的创建与Stage的划分 157
5.4.3 创建Job 163
5.4.4 提交Stage 164
5.4.5 提交Task 165
5.5 执行任务 176
5.5.1 状态更新 176
5.5.2 任务还原 177
5.5.3 任务运行 178
5.6 任务执行后续处理 179
5.6.1 计量统计与执行结果序列化 179
5.6.2 内存回收 180
5.6.3 执行结果处理 181
5.7 小结 187
第6章 计算引擎 188
6.1 迭代计算 188
6.2 什么是shuffle 192
6.3 map端计算结果缓存处理 194
6.3.1 map端计算结果缓存聚合 195
6.3.2 map端计算结果简单缓存 200
6.3.3 容量限制 201
6.4 map端计算结果持久化 204
6.4.1 溢出分区文件 205
6.4.2 排序与分区分组 207
6.4.3 分区索引文件 209
6.5 reduce端读取中间计算结果 210
6.5.1 获取map任务状态 213
6.5.2 划分本地与远程Block 215
6.5.3 获取远程Block 217
6.5.4 获取本地Block 218
6.6 reduce端计算 219
6.6.1 如何同时处理多个map任务的中间结果 219
6.6.2 reduce端在缓存中对中间计算结果执行聚合和排序 220
6.7 map端与reduce端组合分析 221
6.7.1 在map端溢出分区文件,在reduce端合并组合 221
6.7.2 在map端简单缓存、排序分组,在reduce端合并组合 222
6.7.3 在map端缓存中聚合、排序分组,在reduce端组合 222
6.8 小结 223
第7章 部署模式 224
7.1 local部署模式 225
7.2 local-cluster部署模式 225
7.2.1 LocalSparkCluster的启动 226
7.2.2 CoarseGrainedSchedulerBackend的启动 236
7.2.3 启动AppClient 237
7.2.4 资源调度 242
7.2.5 local-cluster模式的任务执行 253
7.3 Standalone部署模式 255
7.3.1 启动Standalone模式 255
7.3.2 启动Master分析 257
7.3.3 启动Worker分析 259
7.3.4 启动Driver Application分析 261
7.3.5 Standalone模式的任务执行 263
7.3.6 资源回收 263
7.4 容错机制 266
7.4.1 Executor异常退出 266
7.4.2 Worker异常退出 268
7.4.3 Master异常退出 269
7.5 其他部署方案 276
7.5.1 YARN 277
7.5.2 Mesos 280
7.6 小结 282
扩展篇 284
第8章 Spark SQL 284
8.1 Spark SQL总体设计 284
8.1.1 传统关系型数据库SQL运行原理 285
8.1.2 Spark SQL运行架构 286
8.2 字典表Catalog 288
8.3 Tree和TreeNode 289
8.4 词法解析器Parser的设计与实现 293
8.4.1 SQL语句解析的入口 294
8.4.2 建表语句解析器DDLParser 295
8.4.3 SQL语句解析器SqlParser 296
8.4.4 Spark代理解析器SparkSQL-Parser 299
8.5 Rule和RuleExecutor 300
8.6 Analyzer与Optimizer的设计与实现 302
8.6.1 语法分析器Analyzer 304
8.6.2 优化器Optimizer 305
8.7 生成物理执行计划 306
8.8 执行物理执行计划 308
8.9 Hive 311
8.9.1 Hive SQL语法解析器 311
8.9.2 Hive SQL元数据分析 313
8.9.3 Hive SQL物理执行计划 314
8.10 应用举例:JavaSparkSQL 314
8.11 小结 320
第9章 流式计算 321
9.1 Spark Streaming总体设计 321
9.2 StreamingContext初始化 323
9.3 输入流接收器规范Receiver 324
9.4 数据流抽象DStream 325
9.4.1 Dstream的离散化 326
9.4.2 数据源输入流InputDStream 327
9.4.3 Dstream转换及构建DStreamGraph 329
9.5 流式计算执行过程分析 330
9.5.1 流式计算例子CustomReceiver 331
9.5.2 Spark Streaming执行环境构建 335
9.5.3 任务生成过程 347
9.6 窗口操作 355
9.7 应用举例 357
9.7.1 安装mosquitto 358
9.7.2 启动mosquitto 358
9.7.3 MQTTWordCount 359
9.8 小结 361
第10章 图计算 362
10.1 Spark GraphX总体设计 362
10.1.1 图计算模型 363
10.1.2 属性图 365
10.1.3 GraphX的类继承体系 367
10.2 图操作 368
10.2.1 属性操作 368
10.2.2 结构操作 368
10.2.3 连接操作 369
10.2.4 聚合操作 370
10.3 Pregel API 371
10.3.1 Dijkstra算法 373
10.3.2 Dijkstra的实现 376
10.4 Graph的构建 377
10.4.1 从边的列表加载Graph 377
10.4.2 在Graph中创建图的方法 377
10.5 顶点集合抽象VertexRDD 378
10.6 边集合抽象EdgeRDD 379
10.7 图分割 380
10.8 常用算法 382
10.8.1 网页排名 382
10.8.2 Connected Components的应用 386
10.8.3 三角关系统计 388
10.9 应用举例 390
10.10 小结 391
第11章 机器学习 392
11.1 机器学习概论 392
11.2 Spark MLlib总体设计 394
11.3 数据类型 394
11.3.1 局部向量 394
11.3.2 标记点 395
11.3.3 局部矩阵 396
11.3.4 分布式矩阵 396
11.4 基础统计 398
11.4.1 摘要统计 398
11.4.2 相关统计 399
11.4.3 分层抽样 401
11.4.4 假设检验 401
11.4.5 随机数生成 402
11.5 分类和回归 405
11.5.1 数学公式 405
11.5.2 线性回归 407
11.5.3 分类 407
11.5.4 回归 410
11.6 决策树 411
11.6.1 基本算法 411
11.6.2 使用例子 412
11.7 随机森林 413
11.7.1 基本算法 414
11.7.2 使用例子 414
11.8 梯度提升决策树 415
11.8.1 基本算法 415
11.8.2 使用例子 416
11.9 朴素贝叶斯 416
11.9.1 算法原理 416
11.9.2 使用例子 418
11.10 保序回归 418
11.10.1 算法原理 418
11.10.2 使用例子 419
11.11 协同过滤 419
11.12 聚类 420
11.12.1 K-means 420
11.12.2 高斯混合 422
11.12.3 快速迭代聚类 422
11.12.4 latent Dirichlet allocation 422
11.12.5 流式K-means 423
11.13 维数减缩 424
11.13.1 奇异值分解 424
11.13.2 主成分分析 425
11.14 特征提取与转型 425
11.14.1 术语频率反转 425
11.14.2 单词向量转换 426
11.14.3 标准尺度 427
11.14.4 正规化尺度 428
11.14.5 卡方特征选择器 428
11.14.6 Hadamard积 429
11.15 频繁模式挖掘 429
11.16 预言模型标记语言 430
11.17 管道 431
11.17.1 管道工作原理 432
11.17.2 管道API介绍 433
11.17.3 交叉验证 435
11.18 小结 436
附录A Utils 437
附录B Akka 446
附录C Jetty 450
附录D Metrics 453
附录E Hadoop word count 456
附录F CommandUtils 458
附录G Netty 461
附录H 源码编译错误 465