《深入理解SPARK:核心思想与源码分析》一书对Spark1.2.0版本的源代码进行了全面而深入的分析,旨在为Spark的优化、定制和扩展提供原理性的指导。阿里巴巴集团专家鼎力推荐、阿里巴巴资深Java开发和大数据专家撰写。
本书分为三篇:
准备篇(第1~2章),介绍了Spark的环境搭建、设计理念与基本架构,帮助读者了解一些背景知识。
核心设计篇(第3~7章),着重讲解SparkContext的初始化、存储体系、任务提交与执行、计算引擎及部署模式的原理和源码分析。通过这部分的内容,读者可以通过源码剖析更加深入理解Spark的核心设计与实现,以便在实际使用中能够快速解决线上问题并对性能进行调优。
扩展篇(第8~11章),主要讲解基于Spark核心的各种扩展及应用,包括SQL处理引擎、Hive处理、流式计算框架Spark Streaming、图计算框架GraphX、机器学习库MLlib等内容。通过阅读这部分内容,读者可以扩展实际项目中对Spark的应用场景,让Spark焕发活力。
目录
- 前言
- 准 备 篇
- 第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
- 核心设计篇
- 第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注册BlockManagerId 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 确认空闲内存方法ensureFreeSpace 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和broadcastCleaner 129
- 4.10 缓存管理器CacheManager 130
- 4.11 压缩算法 133
- 4.12 磁盘写入实现DiskBlockObjectWriter 133
- 4.13 块索引shuffle管理器IndexShuffleBlockManager 135
- 4.14 shuffle内存管理器ShuffleMemoryManager 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
- 扩 展 篇
- 第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代理解析器SparkSQLParser 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转换及构建DStream Graph 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.1K-means 420
- 11.12.2高斯混合 422
- 11.12.3快速迭代聚类 422
- 11.12.4latent 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.6Hadamard积 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