Spark是发源于美国加州大学伯克利分校AMPLab的集群计算平台,它立足于内存计算,性能超过Hadoop百倍,即使使用磁盘,迭代类型的计算也会有10倍速度的提升。Spark从多迭代批量处理出发,兼收并蓄数据仓库、流处理和图计算等多种计算范式,是罕见的全能选手。Spark当下已成为Apache基金会的顶级开源项目,拥有着庞大的社区支持――活跃开发者人数已超过Hadoop MapReduce)。这里,我们为大家分享许鹏的“Apache Spark源码走读”系列博文,从源码方面对这个流行大数据计算框架进行深度了解。
关于博主:许鹏,花名@徽沪一郎,2000年毕业于南京邮电学院,现就业于爱立信上海,在UDM部门从事相关产品研发,个人关注于Linux 内核及实时计算框架如Storm、Spark等。
源码阅读是一件非常容易的事,也是一件非常难的事。容易的是代码就在那里,一打开就可以看到。难的是要通过代码明白作者当初为什么要这样设计,设计之初要解决的主要问题是什么。
在对Spark的源码进行具体的走读之前,如果想要快速对Spark的有一个整体性的认识,阅读Matei Zaharia做的Spark论文是一个非常不错的选择。
在阅读该论文的基础之上,再结合Spark作者在2012 Developer Meetup上做的演讲Introduction to Spark Internals,那么对于Spark的内部实现会有一个比较大概的了解。
有了上述的两篇文章奠定基础之后,再来进行源码阅读,那么就会知道分析的重点及难点。
1. RDD――Resillient Distributed Dataset 弹性分布式数据集。
2. Operation――作用于RDD的各种操作分为transformation和action。
3. Job――作业,一个JOB包含多个RDD及作用于相应RDD上的各种operation。
4. Stage――一个作业分为多个阶段。
5. Partition――数据分区, 一个RDD中的数据可以分成多个不同的区。
6. DAG――Directed Acycle graph,有向无环图,反应RDD之间的依赖关系。
7. Narrow dependency――窄依赖,子RDD依赖于父RDD中固定的data partition。
8. Wide Dependency――宽依赖,子RDD对父RDD中的所有data partition都有依赖。
9. 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。关系如图所示