四九1234 发表于 2014-11-24 16:15:37

Apache Spark源码走读之1 -- Spark论文阅读笔记

本帖最后由 nettman 于 2015-1-6 14:07 编辑

问题导读

1、Spark部署和运行过程是怎样的?
2、RDD的组成部分和作用是什么?
3、静态模型与动态模型之间的关系是什么?
4、spark上进行task集群管理的方式有哪几种?作用是什么?

http://www.aboutyun.com/static/image/hrline/4.gif

楔子
源码阅读是一件非常容易的事,也是一件非常难的事。容易的是代码就在那里,一打开就可以看到。难的是要通过代码明白作者当初为什么要这样设计,设计之初要解决的主要问题是什么。
在对Spark的源码进行具体的走读之前,如果想要快速对Spark的有一个整体性的认识,阅读Matei Zaharia做的Spark论文是一个非常不错的选择。
在阅读该论文的基础之上,再结合Spark作者在2012 Developer Meetup上做的演讲Introduction to Spark Internals,那么对于Spark的内部实现会有一个比较大概的了解。
有了上述的两篇文章奠定基础之后,再来进行源码阅读,那么就会知道分析的重点及难点。

基本概念(Basic Concepts)

RDD - resillient distributed dataset 弹性分布式数据集
Operation - 作用于RDD的各种操作分为transformation和action
Job - 作业,一个JOB包含多个RDD及作用于相应RDD上的各种operation
Stage - 一个作业分为多个阶段
Partition - 数据分区, 一个RDD中的数据可以分成多个不同的区
DAG - Directed Acycle graph, 有向无环图,反应RDD之间的依赖关系
Narrow dependency - 窄依赖,子RDD依赖于父RDD中固定的data partition
Wide Dependency - 宽依赖,子RDD对父RDD中的所有data partition都有依赖
Caching Managenment -- 缓存管理,对RDD的中间计算结果进行缓存管理以加快整体的处理速度

编程模型(Programming Model)

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()



运行态(Runtime view)
不管什么样的静态模型,其在动态运行的时候无外乎由进程,线程组成。
用Spark的术语来说,static view称为dataset view,而dynamic view称为parition view. 关系如图所示



在Spark中的task可以对应于线程,worker是一个个的进程,worker由driver来进行管理。
那么问题来了,这一个个的task是如何从RDD演变过来的呢?下节将详细回答这个问题。

部署(Deployment view)当有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的初始化入参。
data:image/png;base64,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


RDD接口(RDD Interface)

RDD由以下几个主要部分组成

[*]partitions --    partition集合,一个RDD中有多少data partition
[*]dependencies -- RDD依赖关系
[*]compute(parition) -- 对于给定的数据集,需要作哪些计算
[*]preferredLocations --对于data partition的位置偏好
[*]partitioner -- 对于计算出来的数据结果如何分发

缓存机制(caching)

RDD的中间计算结果可以被缓存起来,缓存先选Memory,如果Memory不够的话,将会被写入到磁盘中。
根据LRU(last-recent update)来决定哪先内容继续保存在内存,哪些保存到磁盘。

容错性(Fault-tolerant)

从最初始的RDD到衍生出来的最后一个RDD,中间要经过一系列的处理。那么如何处理中间环节出现错误的场景呢?
Spark提供的解决方案是只对失效的data partition进行事件重演,而无须对整个数据全集进行事件重演,这样可以大大加快场景恢复的开销。
RDD又是如何知道自己的data partition的number该是多少?如果是hdfs文件,那么hdfs文件的block将会成为一个重要的计算依据。

集群管理(cluster management)task运行在cluster之上,除了spark自身提供的standalone部署模式之外,spark还内在支持yarn和mesos.
Yarn来负责计算资源的调度和监控,根据监控结果来重启失效的task或者是重新distributed task一旦有新的node加入cluster的话。
这一部分的内容需要参考yarn的文档。

小结

在源码阅读时,需要重点把握以下两大主线。

[*]静态view 即 RDD, transformation and action
[*]动态view 即 life of a job, 每一个job又分为多个stage,每一个stage中可以包含多个rdd及其transformation,这些stage又是如何映射成为task被distributed到cluster中

相关内容


Apache Spark源码走读之1 -- Spark论文阅读笔记

Apache Spark源码走读之2 -- Job的提交与运行

Apache Spark源码走读之3-- Task运行期之函数调用关系分析

Apache Spark源码走读之4 -- DStream实时流数据处理

Apache Spark源码走读之5-- DStream处理的容错性分析

Apache Spark源码走读之6-- 存储子系统分析

Apache Spark源码走读之7 -- Standalone部署方式分析

Apache Spark源码走读之8 -- Spark on Yarn

Apache Spark源码走读之9 -- Spark源码编译

Apache Spark源码走读之10 -- 在YARN上运行SparkPi

Apache Spark源码走读之11 -- sql的解析与执行

Apache Spark源码走读之12 -- Hive on Spark运行环境搭建

Apache Spark源码走读之13 -- hiveql on spark实现详解

Apache Spark源码走读之14 -- Graphx实现剖析

Apache Spark源码走读之15 -- Standalone部署模式下的容错性分析

Apache Spark源码走读之16 -- spark repl实现详解

Apache Spark源码走读之17 -- 如何进行代码跟读

Apache Spark源码走读之18 -- 使用Intellij idea调试Spark源码

Apache Spark源码走读之19 -- standalone cluster模式下资源的申请与释放

Apache Spark源码走读之20 -- ShuffleMapTask计算结果的保存与读取

Apache Spark源码走读之21 -- WEB UI和Metrics初始化及数据更新过程分析

Apache Spark源码走读之22 -- 浅谈mllib中线性回归的算法实现

Apache Spark源码走读之23 -- Spark MLLib中拟牛顿法L-BFGS的源码实现

Apache Spark源码走读之24 -- Sort-based Shuffle的设计与实现




原文链接:http://www.cnblogs.com/hseagle/p/3664933.html






514330432@qq.co 发表于 2016-1-25 14:02:54

好资料,学习下。

EASONLIU 发表于 2015-2-4 10:11:12

赞一个,先收藏了

YLV 发表于 2015-2-10 11:05:59

不错,刚开始学习

514330432@qq.co 发表于 2015-10-3 21:27:06

好资料,学习下

CGod 发表于 2015-10-5 11:55:27

赞一个

zookeepers 发表于 2015-12-3 13:42:08

能看吗,怎么看不到内容

狂飙中的海绵BB 发表于 2016-3-3 15:28:35

有东西吗?难道是我页面问题?加载不出来?呃。。。

三年级 发表于 2016-3-4 21:41:33

没有

开心生活 发表于 2016-3-6 22:40:37

看看是什么东西呢
页: [1] 2
查看完整版本: Apache Spark源码走读之1 -- Spark论文阅读笔记