文档章节

Spark 源码分析

大数据之路
 大数据之路
发布于 2012/08/24 10:00
字数 1275
阅读 171
收藏 1

一、 启动篇

(一) 引子 在spark-shell终端执行

val arr = Array(1,2,3,4) val rdd = sc.makeRDD(arr)
rdd.collect

alt

以上3行代码构成了一个完整的spark job执行。

(二) 启动篇

shell模式
alt shell模式下启动入口:org.apache.spark.repl. Main
submit模式
spark的启动过程就是实例化SparkContext的过程,涉及到driver、和executor端两边
1. SparkSubmit

AppClient
根据shell文件可以得知, spark入口是org.apache.spark.deploy.SparkSubmit,依次打印各类信息,其中最引人注目的是welcome信息

在源码中的体现:

alt 在SparkSubmit中,执行main函数 1.根据外部参数(在我们应用中对应启动sh文件中的参数)构造SparkSubmitArguments
2.调用submit方法
alt 2.1 构造运行环境:
根据步骤1中构造的SparkSubmitArguments对象,确定运行环境,例如master 、deployMode、childMainClass,如果是yarn-cluster,使用org.apache.spark.deploy.yarn.YarnClusterApplication(有的资料上显示是org.apache.spark.deploy.yarn.Client可能是老版本,YarnClusterApplication这个class与org.apache.spark.deploy.yarn.Client在同一个scala文件中)作为childMainClass;如果是mesos-cluster,使用org.apache.spark.deploy.rest.RestSubmissionClient作为childMainClass;如果是standalone模式,使用org.apache.spark.deploy.rest.RestSubmissionClient作为childMainClass

alt 2.2 反射出上一步骤的生成的 childMainClass,调用其main方法
alt alt alt alt 以yarn-cluster模式下,org.apache.spark.deploy.yarn.YarnClusterApplication启动(在spark-yarn这个module里,与org.apache.spark.deploy.yarn.Client在同一个scala文件中) alt alt 最终调用Client.run()方法: alt 在submitApplication方法中,在经过一些初始化操作后,提交请求到ResouceManager,检查集群的内存情况,检验集群的内存等资源是否满足当前的作业需求,最后正式提交application alt alt 在createContainerLaunchContext方法中,用反射创建ApplicationMaster,负责运行Spark Application的Driver程序,并分配执行需要的Executors。 alt alt alt alt alt alt alt 在ApplicationMaster中,其run方法中调用runImpl,如果是集群模式,调用runDriver启动driver端和executor端 alt alt alt alt 在runDriver方法中,调用startUserApplication方法,创建一个线程,用反射构造出启动脚本中的MainClass,并在线程中执行其main方法。调用registerAM方法,注册driver到yarn集群,并为executor分配资源并启动。 alt alt 在startUserApplication方法中, alt alt alt userClassThread.join通过运行startUserApplication方法返回的线程启动Driver
在其run方法中,通过反射执行userClass中的main方法启动Driver。

  1. Driver篇
    alt Spark会将Driver中的任务提交给Executor中,具体的计算是发生在Executor上,调用线程,在线程池用运行计算,每个任务都会有独立的Executor计算。
    1) SparkContext
    在Driver端SparkContext初始化中, 调用createTaskScheduler方法创建SchedulerBackend和TaskScheduler,实例化DAGScheduler,然后调用TaskScheduler.start方法启动TaskScheduler alt Sparn On Yarn模式下,SchedulerBackend和TaskScheduler通过ClassLoader初始化YarnschedulerBackend和YARTaskscheduler。
    alt 在getClusterManager方法中,返回ExternalClusterManager类型,在Sparn On Yarn模式下,为org.apache.spark.scheduler.cluster.YarnClusterManager的实例,在YarnClusterManager. createTaskScheduler和YarnClusterManager. createSchedulerBackend方法中,返回YarnTaskscheduler和YarnschedulerBackend。根据是deployMode为cluster或client分别返回。 alt 2) SparkEnv
    3) DagScheduler
    4) TaskSchedler
    5) SchedlerBackend
  2. Executor篇
    在registerAM方法中,调用YarnRMClien.register方法把ApplicationMaster注册到yarn并返回YarnAllocator对象,最后调用YarnAllocator.allocateResources方法来构造executor并启动 alt alt alt 在YarnRMClien.register方法中,把ApplicationMaster注册到yarn集群,构造YarnAllocator对象 alt alt 在YarnAllocator.allocateResources方法中,先获取到可用Container(Container作为executor启动容器的抽象,Resource作为启动资源的抽象,主要包括memory和virtualCores_即内存与cpu核数,Container持有Resource的引用)来构造executor并启动资源,调用handleAllocatedContainers方法,根据同节点本地>ack本地>随机的顺序来确定本次分配的Container,最后调用runAllocatedContainers方法启动executor。 alt alt 在handleAllocatedContainers方法,根据同节点数据本地>机架本地>随机的顺序来确定本次分配的Container alt alt 在runAllocatedContainers方法中,构造ExecutorRunnable对象,并在线程中调用其run方法,启动executor alt alt alt 在ExecutorRunnable.run方法中,调用startContainer方法启动executor alt 在startContainer方法中,调用prepareCommand方法,设置JVM参数后,构造启动命令,发送到yarn中启动CoarseGrainedExecutorBackend进程。 alt alt 在prepareCommand方法中,设置JVM参数后,构造启动命令 alt alt alt alt 在org.apache.spark.executor.CoarseGrainedExecutorBackend类中,在其main方法中,先构造参数后,调用run方法进入启动注册ExecutorBackend: alt alt alt 在run方法中,调用SparkEnv.createExecutorEnv方法创建SprkEnv对象,并把当前ExcutorBackend注册到Driver,因为CoarseGrainedExecutorBackend是一个消息体,注册后会自动调用其onStart方法 alt alt alt 在SparkEnv.create方法中,创建BroadcastManager,MapOutputTracker,ShuffleManager,MemoryManager(分StaticMemoryManager和UnifiedMemoryManager),BlockTransferService,BlockManagerMaster,BlockManager alt alt alt alt alt alt alt alt Driver端CoarseGrainedSchedulerBackend(为何是这个,存疑)接收RegisterExecutor消息

二、 Job创建 (一) RDD 1. 性质
alt 1) partitions:分区的集合
alt 2) preferredLocations:根据本地性快速访问到数据的偏好位置

3) dependencies:依赖列表
alt 4) getNumPartitions:分区数
取当前RDD分区数组的长度 alt 5) iterator:计算迭代器
a) 根据当前RDD的存储级别,如果没有存储级别,则调用BlockManager. getOrElseUpdate方法,根据driver端RDD的blockId与executor端BlockId的对应关系,取得数据(后续存储部分详细解析)。
b) 从checkpoint恢复。
alt

Refer:

[1] Spark源码分析

http://tech.dianwoda.com/2018/01/10/sparkyuan-ma-fen-xi/

[2] Spark源码分析 之 Driver和Excutor是怎么跑起来的?(2.2.0版本)

https://www.cnblogs.com/xing901022/p/8260362.html

[3] Spark - 源码分析(一)

https://sycki.com/articles/spark/spark-source-code-1

[4] Spark源码分析之分区器的作用

http://support.huawei.com/huaweiconnect/enterprise/zh/thread-411653.html

本文转载自:http://tech.dianwoda.com/2018/01/10/sparkyuan-ma-fen-xi/

大数据之路
粉丝 1601
博文 515
码字总数 333095
作品 0
武汉
架构师
私信 提问
SPARK 源码分析技术分享(带bilibili视频)

SPARK 源码分析技术分享 (带bilibili视频) 【本站点正在持续更新中…2018-12-05…】 SPARK 1.6.0-cdh5.15.0 Hadoop 2.6.0-cdh5.15.0 spark-scala-maven 微信(技术交流) : thinktothings SPA...

thinktothings
2018/12/02
0
0
Spark成为大数据高手进阶步骤

什么是Spark Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapRedu...

MoksMo
2015/11/05
2.1K
1
Spark源码分析调试环境搭建

目前常用的Spark版本有三种Cloudera、HDP和Apache,源码的获取方式可以在各自官网下载。本文选择Apache版本。 搭建环境所需要的工具如下: CentOS 7 maven 3.5.0 Java 1.8.0 Scala 2.12.2 I...

火力全開
2017/10/26
39
0
OSC 第 69 期高手问答 — Apache Spark 源码剖析

OSCHINA 本期高手问答 ( 4月20日- 4月26日) 我们请来了@eagleonline(许鹏)为大家解答关于 Apache Spark 方面的问题。 许鹏,长期致力于电信领域和互联网的软件研发,在数据处理方面积累了大...

叶秀兰
2015/04/20
2.9K
17
Spark2.1.0之剖析spark-shell

通过在spark-shell中执行word count的过程,让读者了解到可以使用spark-shell提交Spark作业。现在读者应该很想知道spark-shell究竟做了什么呢? 脚本分析 在Spark安装目录的bin文件夹下可以找...

beliefer
2018/04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
10
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
1K
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部