具体描述
《深入理解SPARK:核心思想与源码分析》结合大量图和示例,对Spark的架构、部署模式和工作模块的设计理念、实现源码与使用技巧进行了深入的剖析与解读。
《深入理解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相关技术有独到见解。业余时间喜欢研究中国古代历史,古诗词,旅游,足球等。
目录信息
准 备 篇
第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
· · · · · · (收起)
读后感
这本书很具体的从代码切入,介绍spark的各个组件,前面章节总结概括基本搭建和原理架构等,后面横向的从各个模块触发,比如SparkContext,BlockManager, Memstore以及上层的任务提交,RDD模式的开发和实践,介绍的比较具体。推荐给对spark稍有了解,想深入代码原理的人,源码之...
1. 基本就是罗列各种组建,然后把代码从github copy下来放书上了 2. 代码片段所谓分析就是把代码片段的逻辑翻译成汉字 3. 组件之间的运行关系,以及设计思路基本没有。看不出作者的所谓“分析”和“理解”。只是告诉大家作者看过这些源码。 4. 非常不理解那些5星评价。。。
1. 基本就是罗列各种组建,然后把代码从github copy下来放书上了 2. 代码片段所谓分析就是把代码片段的逻辑翻译成汉字 3. 组件之间的运行关系,以及设计思路基本没有。看不出作者的所谓“分析”和“理解”。只是告诉大家作者看过这些源码。 4. 非常不理解那些5星评价。。。
力荐 Spark作为快速、通用的大规模数据处理引擎,提供了一站式的解决方案。而了解Spark的工作原理与机制,设计思想,可以让我们的工作更加有据可依,对定制化开发、运维与排障等有大有好。Spark源码解读的书,市面上目前有3本,唯有本书是解读最全面、最系统的,值得阅读。
该书比之前看的其他中文Spark书籍更加详细,结合大量源码,作者的分析很是详细,整个内容的衔接性很好,推荐阅读! 准备篇,作者详细介绍了如何快速搭建Spark本地运行环境,源码编译及调试环境,本人亲试了一遍,作者提到的细节都是这个过程中需要注意才能走通的。 核心设计篇...
用户评价
我对这本书的实战应用章节感到尤为困惑,它似乎更偏向于对现有API的冗长罗列和简单的示例代码展示,而非提供解决实际生产问题的思维框架。书中用大量的篇幅介绍了DataFrame/Dataset API的各种操作符,但对于一个经验丰富的Scala或Java开发者来说,这些API的用法大多是显而易见的,通过查阅官方文档即可获得。真正有价值的,是在处理TB级数据时,如何通过细粒度的优化策略,如广播Join的触发时机控制、Bucketting的应用场景选择、甚至是Catalyst Optimizer的执行计划探查与干预,来榨取每一分性能。书中对这些高级调优技巧的描述,寥寥数语,且缺乏具体的、带有数据特征描述的案例支撑。例如,当遇到数据倾斜时,仅仅建议使用Salting技巧是不够的,更关键的是如何识别倾斜的程度、选择合适的Salt位数,以及在Join前后的数据特征变化对比,这些才是决定成败的关键。这本书在这方面,显得过于“安全”和“通用”,未能触及到大型分布式计算系统在真实复杂环境中所面临的那些棘手的、非标准化的难题,读来缺乏实战的酣畅淋漓。
在处理错误与异常恢复机制方面,本书的处理方式显得过于理想化和简化。Spark作为一套分布式系统,其稳定性和健壮性是其生命线,尤其是在面对网络分区、节点故障和JVM崩溃等突发状况时。书中对Checkpointing和State Store的描述,仿佛一切都能按部就班地恢复,但现实中,恢复过程中的数据一致性保证、幂等性处理以及恢复时间对业务SLA的影响,才是工程师们日夜忧虑的焦点。我希望看到对Failure Recovery过程中的时间窗口分析,比如Stage级别的重试策略和Driver故障时的Session恢复机制的内部逻辑。更进一步,对于Structured Streaming中的Watermark机制,书中仅停留于其定义,却未能详尽阐述在极其不规则的事件时间数据到达模式下,Watermark的漂移与累积如何影响最终结果的准确性,以及如何通过调整Update模式或Append模式下的逻辑,来权衡延迟与精确度的矛盾。这部分内容如果能结合一些生产环境中的“崩溃日志分析”来讲解,其说服力和实用价值将大大提升,目前的叙述方式,更像是理论教科书,而非工程实战指南。
最后,在生态系统集成和部署策略这部分,本书的叙述显得陈旧且缺乏前瞻性。大量篇幅依然停留在YARN和Standalone模式的配置细节上,对于现代云原生环境中Kubernetes作为首选的部署方案,其Spark Operator的最新进展、动态资源调度机制,以及与云存储(如S3、ADLS)的深度集成优化(例如Direct HDFS Access的替代方案),介绍得非常滞后。在数据湖架构日益普及的今天,Spark与Delta Lake、Iceberg或Hudi这类事务性存储的集成优化,才是决定数据管道稳定性的关键。书中对这些外部项目的提及,仅限于概念层面,未能展示如何利用Spark的API去高效地处理Merge、Update或Delete等DML操作,以及这些操作在分布式环境下的开销模型。一本旨在“深入理解”的现代技术书籍,其内容的时效性和对前沿部署范式的覆盖度至关重要,而本书在这方面的缺失,使得它更像是一份几年前的技术快照,而非指导未来架构的有力武器。
这本书的编程模型章节,尽管提到了RDD、DataFrame和Dataset,但对于它们之间深层次的演进逻辑和设计哲学上的取舍,阐述得不够透彻。RDD作为Spark的基石,其内存效率和序列化开销在处理复杂对象时的问题,是催生DataFrame和Catalyst优化的直接动因,但书中对这种“痛点驱动创新”的过程描述得平淡无奇。更令我不解的是,对于Dataset在Scala和Java之间的设计差异——即Java环境下的Dataset如何通过类型擦除机制退化回DataFrame——这一重要的设计权衡,书中没有进行任何批判性的讨论。为何要保留Dataset这个接口?它在编译期类型安全带来的便利,在实际部署中又如何被环境所限制?这涉及到语言特性与分布式系统设计范式的冲突,是值得深入探讨的议题。当前的章节给人的感觉是,Spark的演化史被简化成了一个功能点叠加的过程,而非一系列深刻的技术抉择和妥协的结果,缺少了对“为何如此设计”的深层哲学思考。
这本号称“深入理解”的著作,实际上给我的感觉更像是一本高级用户手册的集合,而非真正的洞察之作。开篇部分对Spark架构的介绍,虽然罗列了大量的组件名称和模块划分,但那种讲解方式更像是在复述官方文档,缺乏一种“庖丁解牛”式的深入剖析。比如,对于DAGScheduler和TaskScheduler之间的交互细节,书中只是简单地描述了它们各自的职责,却没有深入探讨在复杂作业调度场景下,两者是如何在资源竞争、容错恢复和性能调优之间进行微妙的权衡和协作的。我期待看到的是对这些底层机制的深入剖析,例如Stage划分背后的成本模型、Shuffle Manager在不同部署模式下的性能差异,以及Stream/Batch融合架构下,Spark如何维持其统一性的底层设计哲学。可惜,这些地方都浅尝辄止,读完后感觉对Spark的“骨骼结构”有了基本的认知,但对“血肉和神经系统”的理解依然模糊不清,仿佛只是站在了建筑物的外部观察其宏伟,却未能进入内部领略其精妙的工程实现。那种“深入”感,更多的停留在概念的堆砌,而非原理的洞察,对于一个期望真正掌握Spark核心精髓的工程师来说,这点是相当令人失望的。
全书都是讲解代码,可以说是代码的注释。不过讲解的体系结构对于阅读源码还是有帮助的;另外使用的Spark版本是1.2.3为主,阅读新的源码还是以最新发布的为主。
全书都是讲解代码,可以说是代码的注释。不过讲解的体系结构对于阅读源码还是有帮助的;另外使用的Spark版本是1.2.3为主,阅读新的源码还是以最新发布的为主。
成段成段的源码,对这种堆砌式的写作无感。
这本书不适合入门,过多的代码细节很容易让人迷失其中。由于Spark的发展太快了,书中很多的源码和设计都和现在的Spark对应不上。
flag,两周。 一刷。图计算这块是个坑。