2019独角兽企业重金招聘Python工程师标准>>>

一、 启动篇

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

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

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

(二) 启动篇

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

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

在源码中的体现:

在SparkSubmit中,执行main函数 1.根据外部参数(在我们应用中对应启动sh文件中的参数)构造SparkSubmitArguments
2.调用submit方法
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

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

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

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

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

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

转载于:https://my.oschina.net/leejun2005/blog/74362

Spark 源码分析相关推荐

  1. Spark源码分析之七:Task运行(一)

    在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...

  2. Spark源码分析之九:内存管理模型

    Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...

  3. spark 源码分析 Blockmanager

    原文链接 参考, Spark源码分析之-Storage模块 对于storage, 为何Spark需要storage模块?为了cache RDD  Spark的特点就是可以将RDD cache在memo ...

  4. Spark源码分析 – DAGScheduler

    DAGScheduler的架构其实非常简单, 1. eventQueue, 所有需要DAGScheduler处理的事情都需要往eventQueue中发送event 2. eventLoop Threa ...

  5. spark 源码分析之十八 -- Spark存储体系剖析

    本篇文章主要剖析BlockManager相关的类以及总结Spark底层存储体系. 总述 先看 BlockManager相关类之间的关系如下: 我们从NettyRpcEnv 开始,做一下简单说明. Ne ...

  6. spark 源码分析之二十 -- Stage的提交

    引言 上篇 spark 源码分析之十九 -- DAG的生成和Stage的划分 中,主要介绍了下图中的前两个阶段DAG的构建和Stage的划分. 本篇文章主要剖析,Stage是如何提交的. rdd的依赖 ...

  7. spark 源码分析之十九 -- DAG的生成和Stage的划分

    上篇文章 spark 源码分析之十八 -- Spark存储体系剖析 重点剖析了 Spark的存储体系.从本篇文章开始,剖析Spark作业的调度和计算体系. 在说DAG之前,先简单说一下RDD. 对RD ...

  8. Spark源码分析:多种部署方式之间的区别与联系

    作者:过往记忆 从官方的文档我们可以知道, Spark 的部署方式有很多种:local.Standalone.Mesos.YARN-..不同部署方式的后台处理进程是不一样的,但是如果我们从代码的角度来 ...

  9. Spark源码分析之Sort-Based Shuffle读写流程

    一 概述 我们知道Spark Shuffle机制总共有三种: # 未优化的Hash Shuffle:每一个ShuffleMapTask都会为每一个ReducerTask创建一个单独的文件,总的文件数是 ...

最新文章

  1. 一个黑客与电脑白痴的聊天纪录!!!
  2. 2020-11-23(彻底理解KMP)
  3. 【测试点分析】1060 爱丁顿数 (25分)_21行代码
  4. C#UDP通讯UdpClient
  5. 信息学奥赛一本通 1181:整数奇偶排序 | OpenJudge NOI 1.10 06:整数奇偶排序
  6. 面试前可以在这里刷刷题,很巴适!(Java版)
  7. 网络编程 - socket接收大数据
  8. 认识div(division)在排版中的作用
  9. Spark修炼之道(高级篇)——Spark源码阅读:第八节 Task执行
  10. 孙鑫VC学习笔记:第十二讲 (六) 读写注册表
  11. 怎么画单极交流放大电路波形图_集成电路的种类
  12. 什么叫结构化程序设计,他的主要内容是什么?
  13. 计算机科学也有民科!看知乎计算机民科辩论大战!
  14. 百度编辑器UEditor图片上传尺寸大小设置
  15. 国光师傅文件上传靶场练习
  16. 黑苹果oc清除nvram_自己组装一台“iMac”是什么体验(下):AMD 平台也能吃上黑苹果...
  17. DeepFlow: Deep Learning-Based Malware Detection by Mining Android Application for Abnormal Usage 2
  18. EL表达式中获取 list集合长度
  19. django MVT模式介绍
  20. 2022危险化学品生产单位安全生产管理人员考题及在线模拟考试

热门文章

  1. 科普丨深度神经网络与生命的意义
  2. python写入csv(解决了乱码问题)
  3. AI+视频分析:实时监测无处不在的安全风险
  4. 量子计算技术的研究现状与趋势
  5. 我们为什么要探索人脑的奥秘?
  6. 俄罗斯“木船”机器人系统将于2020年部署部队
  7. 推翻《Nature》:生命不息,神经发生不止...
  8. 一打在2019年亮相的迷人科技项目:飞行汽车、子弹头列车、登月、……
  9. 55 岁中国芯片首富,捐出 200 亿:建一所理工大学
  10. 12月31日写成13月1日引发重大 Bug,程序员新年就要被“祭天”?