欢迎转载,转载请注明出处,徽沪一郎。node
源码阅读是一件很是容易的事,也是一件很是难的事。容易的是代码就在那里,一打开就能够看到。难的是要经过代码明白做者当初为何要这样设计,设计之初要解决的主要问题是什么。web
在对Spark的源码进行具体的走读以前,若是想要快速对Spark的有一个总体性的认识,阅读Matei Zaharia作的Spark论文是一个很是不错的选择。编程
在阅读该论文的基础之上,再结合Spark做者在2012 Developer Meetup上作的演讲Introduction to Spark Internals,那么对于Spark的内部实现会有一个比较大概的了解。缓存
有了上述的两篇文章奠基基础以后,再来进行源码阅读,那么就会知道分析的重点及难点。分布式
RDD - resillient distributed dataset 弹性分布式数据集ide
Operation - 做用于RDD的各类操做分为transformation和actionspa
Job - 做业,一个JOB包含多个RDD及做用于相应RDD上的各类operation线程
Stage - 一个做业分为多个阶段scala
Partition - 数据分区, 一个RDD中的数据能够分红多个不一样的区设计
DAG - Directed Acycle graph, 有向无环图,反应RDD之间的依赖关系
Narrow dependency - 窄依赖,子RDD依赖于父RDD中固定的data partition
Wide Dependency - 宽依赖,子RDD对父RDD中的全部data partition都有依赖
Caching Managenment -- 缓存管理,对RDD的中间计算结果进行缓存管理以加快总体的处理速度
RDD是只读的数据分区集合,注意是数据集。
做用于RDD上的Operation分为transformantion和action。 经Transformation处理以后,数据集中的内容会发生更改,由数据集A转换成为数据集B;而经Action处理以后,数据集中的内容会被归约为一个具体的数值。
只有当RDD上有action时,该RDD及其父RDD上的全部operation才会被提交到cluster中真正的被执行。
从代码到动态运行,涉及到的组件以下图所示。
演示代码
val sc = new SparkContext("Spark://...", "MyJob", home, jars) val file = sc.textFile("hdfs://...") val errors = file.filter(_.contains("ERROR")) errors.cache() errors.count()
无论什么样的静态模型,其在动态运行的时候无外乎由进程,线程组成。
用Spark的术语来讲,static view称为dataset view,而dynamic view称为parition view. 关系如图所示
在Spark中的task能够对应于线程,worker是一个个的进程,worker由driver来进行管理。
那么问题来了,这一个个的task是如何从RDD演变过来的呢?下节将详细回答这个问题。
当有Action做用于某RDD时,该action会做为一个job被提交。
在提交的过程当中,DAGScheduler模块介入运算,计算RDD之间的依赖关系。RDD之间的依赖关系就造成了DAG。
每个JOB被分为多个stage,划分stage的一个主要依据是当前计算因子的输入是不是肯定的,若是是则将其分在同一个stage,避免多个stage之间的消息传递开销。
当stage被提交以后,由taskscheduler来根据stage来计算所须要的task,并将task提交到对应的worker.
Spark支持如下几种部署模式1)standalone 2)Mesos 3) yarn. 这些部署模式将做为taskscheduler的初始化入参。
RDD由如下几个主要部分组成
RDD的中间计算结果能够被缓存起来,缓存先选Memory,若是Memory不够的话,将会被写入到磁盘中。
根据LRU(last-recent update)来决定哪先内容继续保存在内存,哪些保存到磁盘。
从最初始的RDD到衍生出来的最后一个RDD,中间要通过一系列的处理。那么如何处理中间环节出现错误的场景呢?
Spark提供的解决方案是只对失效的data partition进行事件重演,而无须对整个数据全集进行事件重演,这样能够大大加快场景恢复的开销。
RDD又是如何知道本身的data partition的number该是多少?若是是hdfs文件,那么hdfs文件的block将会成为一个重要的计算依据。
task运行在cluster之上,除了spark自身提供的standalone部署模式以外,spark还内在支持yarn和mesos.
Yarn来负责计算资源的调度和监控,根据监控结果来重启失效的task或者是从新distributed task一旦有新的node加入cluster的话。
这一部分的内容须要参考yarn的文档。
在源码阅读时,须要重点把握如下两大主线。