深入理解spark核心思想及源码分析.pdf
http://www.100md.com
2020年11月16日
![]() |
| 第1页 |
![]() |
| 第6页 |
![]() |
| 第12页 |
![]() |
| 第22页 |
![]() |
| 第42页 |
参见附件(6684KB,91页)。
深入理解spark核心思想及源码分析
本书对Spark源代码进行了全面而深入的分析,旨在为Spark的优化、定制和扩展提供原理性的指导。阿里巴巴集团专家鼎力推荐,阿里巴巴资深Java开发和大数据专家撰写,Spark以其先进的设计理念,迅速成为社区的热门项目

相关内容部分预览






图书简介
本书对Spark源代码进行了全面而深入的分析,旨在为Spark的优化、定制和扩展提供原理性的指导。阿里巴巴集团专家鼎力推荐,阿里巴巴资深Java开发和大数据专家撰写。
本书对Spark的核心模块、部署和协作模块的实现原理与使用技巧进行了深入的剖析与解读。
本书分为三篇:
准备篇(第1~2章),介绍了Spark的环境搭建、设计理念与基本架构,帮助读者了解一些背景知识。
核心设计篇(第3~7章),着重讲解SparkContext的初始化、存储体系、任务提交与执行、计算引擎及部署模式的原理和源码分析。通过这部分的内容,读者可以通过源码剖析更加深入理解Spark的核心设计与实现,以便在实际使用中能够快速解决线上问题并对性能进行调优。
扩展篇(第8~11章),主要讲解基于Spark核心的各种扩展及应用,包括SQL处理引擎、Hive处理、流式计算框架Spark Streaming、图计算框架GraphX、机器学习库MLlib等内容。通过阅读这部分内容,读者可以扩展实际项目中对Spark的应用场景,让Spark焕发活力。
图书目录
Contents 目录
前言
准 备 篇
第1章 环境准备2
1.1 运行环境准备2
1.1.1 安装JDK3
1.1.2 安装Scala3
1.1.3 安装Spark4
1.2 Spark初体验4
1.2.1 运行spark-shell4
1.2.2 执行word count5
1.2.3 剖析spark-shell7
1.3 阅读环境准备11
1.4 Spark源码编译与调试13
1.5 小结17
第2章 Spark设计理念与基本架构18
2.1 初识Spark18
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 创建执行环境SparkEnv30
3.2.1 安全管理器SecurityManager31
3.2.2 基于Akka的分布式消息系统ActorSystem31
3.2.3 map任务输出跟踪器mapOutputTracker32
3.2.4 实例化ShuffleManager34
3.2.5 shuffle线程内存管理器ShuffleMemoryManager34
3.2.6 块传输服务BlockTransferService35
3.2.7 BlockManagerMaster介绍35
3.2.8 创建块管理器BlockManager36
3.2.9 创建广播管理器Broadcast-Manager36
3.2.10 创建缓存管理器CacheManager37
3.2.11 HTTP文件服务器HttpFile-Server37
3.2.12 创建测量系统MetricsSystem39
3.2.13 创建SparkEnv40
3.3 创建metadataCleaner41
3.4 SparkUI详解42
3.4.1 listenerBus详解43
3.4.2 构造JobProgressListener46
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 创建任务调度器TaskScheduler55
3.6.1 创建TaskSchedulerImpl55
3.6.2 TaskSchedulerImpl的初始化57
3.7 创建和启动DAGScheduler57
3.8 TaskScheduler的启动60
3.8.1 创建LocalActor60
3.8.2 ExecutorSource的创建与注册62
3.8.3 ExecutorActor的构建与注册64
3.8.4 Spark自身ClassLoader的创建64
3.8.5 启动Executor的心跳线程66
3.9 启动测量系统MetricsSystem69
3.9.1 注册Sources70
3.9.2 注册Sinks70
3.9.3 给Sinks增加Jetty的Servlet-ContextHandler71
3.10 创建和启动ExecutorAllocation-Manager72
3.11 ContextCleaner的创建与启动73
3.12 Spark环境更新74
3.13 创建DAGSchedulerSource和BlockManagerSource76
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-tContext85
4.2.3 RPC客户端工厂Transport-ClientFactory86
4.2.4 Netty服务器TransportServer87
4.2.5 获取远程shuffle文件88
4.2.6 上传shuffle文件89
4.3 BlockManagerMaster对Block-Manager的管理90
4.3.1 BlockManagerMasterActor90
4.3.2 询问Driver并获取回复方法92
4.3.3 向BlockManagerMaster注册BlockManagerId93
4.4 磁盘块管理器DiskBlockManager94
4.4.1 DiskBlockManager的构造过程94
4.4.2 获取磁盘文件方法getFile96
4.4.3 创建临时Block方法create-TempShuffleBlock96
4.5 磁盘存储DiskStore97
4.5.1 NIO读取方法getBytes97
4.5.2 NIO写入方法putBytes98
4.5.3 数组写入方法putArray98
4.5.4 Iterator写入方法putIterator98
4.6 内存存储MemoryStore99
4.6.1 数据存储方法putBytes101
4.6.2 Iterator写入方法putIterator详解101
4.6.3 安全展开方法unrollSafely102
4.6.4 确认空闲内存方法ensureFreeSpace105
4.6.5 内存写入方法putArray107
4.6.6 尝试写入内存方法tryToPut108
4.6.7 获取内存数据方法getBytes109
4.6.8 获取数据方法getValues110
4.7 Tachyon存储TachyonStore110
4.7.1 Tachyon简介111
4.7.2 TachyonStore的使用112
4.7.3 写入Tachyon内存的方法putIntoTachyonStore113
4.7.4 获取序列化数据方法getBytes113
4.8 块管理器BlockManager114
4.8.1 移出内存方法dropFrom-Memory114
4.8.2 状态报告方法reportBlockStatus116
4.8.3 单对象块写入方法putSingle117
4.8.4 序列化字节块写入方法putBytes118
4.8.5 数据写入方法doPut118
4.8.6 数据块备份方法replicate121
4.8.7 创建DiskBlockObjectWriter的方法getDiskWriter125
4.8.8 获取本地Block数据方法getBlockData125
4.8.9 获取本地shuffle数据方法doGetLocal126
4.8.10 获取远程Block数据方法doGetRemote127
4.8.11 获取Block数据方法get128
4.8.12 数据流序列化方法dataSerializeStream129
4.9 metadataCleaner和broadcastCleaner129
4.10 缓存管理器CacheManager130
4.11 压缩算法133
4.12 磁盘写入实现DiskBlockObjectWriter133
4.13 块索引shuffle管理器IndexShuffleBlockManager135
4.14 shuffle内存管理器ShuffleMemoryManager137
4.15 小结138
第5章 任务提交与执行139
5.1 任务概述139
5.2 广播Hadoop的配置信息142
5.3 RDD转换及DAG构建144
5.3.1 为什么需要RDD144
5.3.2 RDD实现分析146
5.4 任务提交152
5.4.1 任务提交的准备152
5.4.2 finalStage的创建与Stage的划分157
5.4.3 创建Job163
5.4.4 提交Stage164
5.4.5 提交Task165
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 什么是shuffle192
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 划分本地与远程Block215
6.5.3 获取远程Block217
6.5.4 获取本地Block218
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 启动AppClient237
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 YARN277
7.5.2 Mesos280
7.6 小结282
扩 展 篇
第8章 Spark SQL284
8.1 Spark SQL总体设计284
8.1.1 传统关系型数据库SQL运行原理285
8.1.2 Spark SQL运行架构286
8.2 字典表Catalog288
8.3 Tree和TreeNode289
8.4 词法解析器Parser的设计与实现293
8.4.1 SQL语句解析的入口294
8.4.2 建表语句解析器DDLParser295
8.4.3 SQL语句解析器SqlParser296
8.4.4 Spark代理解析器SparkSQLParser299
8.5 Rule和RuleExecutor300
8.6 Analyzer与Optimizer的设计与实现302
8.6.1 语法分析器Analyzer304
8.6.2 优化器Optimizer305
8.7 生成物理执行计划306
8.8 执行物理执行计划308
8.9 Hive311
8.9.1 Hive SQL语法解析器311
8.9.2 Hive SQL元数据分析313
8.9.3 Hive SQL物理执行计划314
8.10 应用举例:JavaSparkSQL314
8.11 小结320
第9章 流式计算321
9.1 Spark Streaming总体设计321
9.2 StreamingContext初始化323
9.3 输入流接收器规范Receiver324
9.4 数据流抽象DStream325
9.4.1 Dstream的离散化326
9.4.2 数据源输入流InputDStream327
9.4.3 Dstream转换及构建DStream Graph329
9.5 流式计算执行过程分析330
9.5.1 流式计算例子CustomReceiver331
9.5.2 Spark Streaming执行环境构建335
9.5.3 任务生成过程347
9.6 窗口操作355
9.7 应用举例357
9.7.1 安装mosquitto358
9.7.2 启动mosquitto358
9.7.3 MQTTWordCount359
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 API371
10.3.1 Dijkstra算法373
10.3.2 Dijkstra的实现376
10.4 Graph的构建377
10.4.1 从边的列表加载Graph377
10.4.2 在Graph中创建图的方法377
10.5 顶点集合抽象VertexRDD378
10.6 边集合抽象EdgeRDD379
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-means420
11.12.2高斯混合422
11.12.3快速迭代聚类422
11.12.4latent Dirichlet allocation422
11.12.5流式K-means423
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 Utils437
附录B Akka446
附录C Jetty450
附录D Metrics453
附录E Hadoop word count456
附录F CommandUtils458
附录G Netty461
附录H 源码编译错误465
深入浅出理解 Spark 部署与工作原理
一、Spark 概述
Spark 是 UC Berkeley AMP Lab 开源的通用分布式并行计算框架,目前已成为 Apache 软件基金会的顶级开源项目。Spark 支持多种编程语言,包括 Java、Python、R 和 Scala,同时 Spark 也支持 Hadoop 的底层存储系统 HDFS,但 Spark 不依赖 Hadoop。
1.1 Spark 与 Hadoop
Spark 基于 Hadoop MapReduce 算法实现的分布式计算,拥有 Hadoop MapReduce 所具有的优点,并且具有更高的运算速度。Spark 能够比 Hadoop 运算更快,主要原因是:Hadoop 在一次 MapReduce 运算之后,会将数据的运算结果从内存写入到磁盘中,第二次 MapReduce 运算时在从磁盘中读取数据,两次对磁盘的操作,增加了多余的 IO 消耗;而 Spark 则是将数据一直缓存在内存中,运算时直接从内存读取数据,只有在必要时,才将部分数据写入到磁盘中。除此之外,Spark 使用最先进的 DAG(Directed Acyclic Graph,有向无环图)调度程序、查询优化器和物理执行引擎,在处理批量处理以及处理流数据时具有较高的性能。按照Spark 官网的说法,Spark 相对于 Hadoop 而言,Spark 能够达到 100 倍以上的运行负载。

(图片来源:Apache Spark™)
1.2 Spark 架构及生态
Spark 除了 Spark Core 外,还有其它由多个组件组成,目前主要有四个组件:Spark SQL、Spark Streaming、MLlib、GraphX。这四个组件加上 Spark Core 组成了 Spark 的生态。通常,我们在编写一个 Spark 应用程序,需要用到 Spark
Core 和其余 4 个组件中的至少一个。Spark 的整体构架图如下图所示:

Spark Core:是 Spark 的核心,主要负责任务调度等管理功能。Spark
Core 的实现依赖于 RDDs(Resilient Distributed Datasets,弹性分布式数据集)的程序抽象概念。
Spark SQL:是 Spark 处理结构化数据的模块,该模块旨在将熟悉的 SQL 数据库查询与更复杂的基于算法的分析相结合,Spark
SQL 支持开源 Hive 项目及其类似 SQL 的 HiveQL 查询语法。Spark
SQL 还支持 JDBC 和 ODBC 连接,能够直接连接现有的数据库。
Spark Streaming:这个模块主要是对流数据的处理,支持流数据的可伸缩和容错处理,可以与 Flume(针对数据日志进行优化的一个系统)和 Kafka(针对分布式消息传递进行优化的流处理平台)等已建立的数据源集成。Spark Streaming 的实现,也使用 RDD 抽象的概念,使得在为流数据(如批量历史日志数据)编写应用程序时,能够更灵活,也更容易实现。
MLlib:主要用于机器学习领域,它实现了一系列常用的机器学习和统计算法,如分类、回归、聚类、主成分分析等算法。
GraphX:这个模块主要支持数据图的分析和计算,并支持图形处理的 Pregel API 版本。GraphX 包含了许多被广泛理解的图形算法,如 PageRank。
1.3 Spark 运行模式
Spark 有多种运行模式,由图 2 中,可以看到 Spark 支持本地运行模式(Local 模式)、独立运行模式(Standalone 模式)、Mesos、YARN(Yet Another Resource Negotiator)、Kubernetes 模式等。
本地运行模式是 Spark 中最简单的一种模式,也可称作伪分布式模式。
独立运行模式为 Spark 自带的一种集群管理模式,Mesos 及 YARN 两种模式也是比较常用的集群管理模式。相比较 Mesos 及 YARN 两种模式而言,独立运行模式是最简单,也最容易部署的一种集群运行模式。
Kubernetes 是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。
Spark 底层还支持多种数据源,能够从其它文件系统读取数据,如 HDFS、Amazon S3、Hypertable、HBase 等。Spark 对这些文件系统的支持,同时也丰富了整个 Spark 生态的运行环境。
二、Spark 部署模式
Spark 支持多种分布式部署模式,主要支持三种部署模式,分别是:Standalone、Spark on YARN和 Spark on Mesos模式。
Standalone模式为 Spark 自带的一种集群管理模式,即独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统。它是 Spark 实现的资源调度框架,其主要的节点有 Driver 节点、Master 节点和 Worker 节点。Standalone模式也是最简单最容易部署的一种模式。
Spark on YARN模式,即 Spark 运行在Hadoop YARN框架之上的一种模式。Hadoop YARN(Yet Another Resource
Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度。
Spark on Mesos模式,即 Spark 运行在Apache Mesos框架之上的一种模式。Apache Mesos是一个更强大的分布式资源管理框架,负责集群资源的分配,它允许多种不同的框架部署在其上,包括YARN。它被称为是分布式系统的内核。
三种架构都采用了Master/Worker(Slave)的架构,Spark 分布式运行架构大致如下:

本文主要介绍 Spark 的Standalone模式的部署。
三、环境准备
出于学习的目的,本文将 Spark 部署在安装有 CentOS7 系统的 VirtualBox 虚拟机中。
搭建 Spark 集群,需要准备以下文件及环境:
jdk-8u211-linux-x64.tar.gz
spark-2.4.3-bin-hadoop2.7.tgz
3 个独立的 CentOS7 虚拟机系统,机器集群规划如下:

深入理解spark核心思想及源码分析截图



相关资料1:
- 郑钦安的学术思想探讨.PDF
- 03019-《民国丛书第三编019册:1 欧洲政治思想史》卷上 高一涵.pdf
- 数学分析解题思想与方法-杨传林.pdf
- 汤用彤佛学与哲学思想论集.pdf
- 02007-《民国丛书第二编007册:清代思想史纲》谭丕模.pdf
- 洗脑术:思想控制的荒唐史.pdf
- 著名蜀医卢铸之生平及学术思想.PDF
- 《为了活下去的思想》 - 上野千鹤子.pdf .epub .mobi .azw3
- 郑钦安的学术思想探讨.PDF
- 著名蜀医卢铸之生平及学术思想.PDF
- 01036-《民国丛书第一编036册:中国经济思想史》唐庆增.pdf
- 《津通识读本:康德(中文版)-罗杰.斯克鲁顿 (Scruton R.)-①康德, I.(1724~1804)-哲学思想-研究》.mobi
- 明堂思想与道教符号养生
- 健全的思想[法]霍尔巴赫.pdf
- 伟大的思想(第一辑)论生命之短暂.pdf .epub .mobi .azw3




