
深入理解SPARK:核心思想与源码分析
《深入理解SPARK:核心思想与源码分析》结合大量图和示例,对Spark的架构、部署模式和工作模组的设计理念、实现源码与使用技巧进行了深入的剖析与解读。
本书特色:
按照源码分析的习惯设计,条分缕析。
多图、多示例,帮读者快速在头脑中“建模”。
原理与实现剖析,帮助读者提升架构设计、程式设计等方面的能力。
儘可能保留较多的源码,方便离线和移动环境的阅读。
基本介绍
- 中文名:深入理解SPARK:核心思想与源码分析
- 外文名:Spark Internals:Core Design and Source Code Analysis
- 作 者:耿嘉安
- ISBN:9787111522348
- 技术範畴:大数据
- 出版社:机械工业出版社
- 出版时间:2016-01-01
- 包装:平装
- 开本:16开
- 页数:469
- 定价:99
内容简介
《深入理解SPARK:核心思想与源码分析》一书对Spark1.2.0版本的原始码进行了全面而深入的分析,旨在为Spark的最佳化、定製和扩展提供原理性的指导。阿里巴巴集团专家鼎力推荐、阿里巴巴资深Java开发和大数据专家撰写。
本书分为三篇:
準备篇(第1~2章),介绍了Spark的环境搭建、设计理念与基本架构,帮助读者了解一些背景知识。
核心设计篇(第3~7章),着重讲解SparkContext的初始化、存储体系、任务提交与执行、计算引擎及部署模式的原理和源码分析。通过这部分的内容,读者可以通过源码剖析更加深入理解Spark的核心设计与实现,以便在实际使用中能够快速解决线上问题并对性能进行调优。
扩展篇(第8~11章),主要讲解基于Spark核心的各种扩展及套用,包括SQL处理引擎、Hive处理、流式计算框架Spark Streaming、图计算框架GraphX、机器学习库MLlib等内容。通过阅读这部分内容,读者可以扩展实际项目中对Spark的套用场景,让Spark焕发活力。
作者简介
耿嘉安,10年IT行业相关经验。就职于阿里巴巴商家业务事业部,任资深Java工程师,专注于开源和大数据领域,目前与小伙伴们基于ODPS构建阿里的大数据商业解决方案——御膳房。在大量的工作实践中,对J2EE、JVM、Tomcat、Spring、Hadoop、Spark、MySQL、Redis都有深入研究,尤其喜欢剖析开源项目的源码实现。早期从事J2EE企业级套用开发,对Java相关技术有独到见解。业余时间喜欢研究中国古代历史,古诗词,旅游,足球等。
精彩书评
伴随着网际网路的不断演进,人类所面临的数据在体量,产生速度和多样性方面阶跃性发展,随之而来的是数据计算和处理方式的多样化,目前越来越多的数据处理链路是通过多种计算组合而成,例如批量与流式计算,图计算,互动式查询等。而以往几个独立计算系统“物理”拼装组合成的複杂系统在处理这些问题时,往往在成本和效率上产生瓶颈。Spark从叠代计算的数据复用切入,底层一个runtime来支撑多种计算模型,越来越受到业界的重视,社区发展非常迅速。而本书从源码分析角度深入剖析系统,希望读者不仅做到知其然,更要知其所以然,对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.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