天天看点

深入理解Spark:核心思想与源码分析. 2.2 Spark基础知识

<b>2.2 spark基础知识</b>

1.版本变迁

经过4年多的发展,spark目前的版本是1.4.1。我们简单看看它的版本发展过程。

1)spark诞生于ucberkeley的amp实验室(2009)。

2)spark正式对外开源(2010年)。

3)spark 0.6.0版本发布(2012-10-15),进行了大范围的性能改进,增加了一些新特性,并对standalone部署模式进行了简化。

4)spark 0.6.2版本发布(2013-02-07),解决了一些bug,并增强了系统的可用性。

5)spark 0.7.0版本发布(2013-02-27),增加了更多关键特性,例如,python api、spark streaming的alpha版本等。

6)spark 0.7.2版本发布(2013-06-02),性能改进并解决了一些bug,新增api使用的例子。

7)spark接受进入apache孵化器(2013-06-21)。

8)spark 0.7.3版本发布(2013-07-16),解决一些bug,更新spark

streaming api等。

9)spark 0.8.0版本发布(2013-09-25),一些新功能及可用性改进。

10)spark 0.8.1版本发布(2013-12-19),支持scala 2.9、yarn 2.2、standalone部署模式下调度的高可用性、shuffle的优化等。

11)spark 0.9.0版本发布(2014-02-02),增加了graphx,机器学习新特性,流式计算新特性,核心引擎优化(外部聚合、加强对yarn的支持)等。

12)spark 0.9.1版本发布(2014-04-09),增强使用yarn的稳定性,改进scala和python api的奇偶性。

13)spark 1.0.0版本发布(2014-05-30),spark sql、mllib、graphx和spark

streaming都增加了新特性并进行了优化。spark核心引擎还增加了对安全yarn集群的支持。

14)spark 1.0.1版本发布(2014-07-11),增加了spark

sql的新特性和对json数据的支持等。

15)spark 1.0.2版本发布(2014-08-05),spark核心api及streaming、python、mllib的bug修复。

16)spark 1.1.0版本发布(2014-09-11)。

17)spark 1.1.1版本发布(2014-11-26),spark核心api及streaming、python、sql、graphx和mllib的bug修复。

18)spark 1.2.0版本发布(2014-12-18)。

19)spark 1.2.1版本发布(2015-02-09),spark核心api及streaming、python、sql、graphx和mllib的bug修复。

20)spark 1.3.0版本发布(2015-03-13)。

21)spark 1.4.0版本发布(2015-06-11)。

22)spark 1.4.1版本发布(2015-07-15),dataframe

api及streaming、python、sql和mllib的bug修复。

2.基本概念

要想对spark有整体性的了解,推荐读者阅读matei zaharia的spark论文。此处笔者先介绍spark中的一些概念:

rdd(resillient

distributed dataset):弹性分布式数据集。

task:具体执行任务。task分为shufflemaptask和resulttask两种。shufflemaptask和resulttask分别类似于hadoop中的map和reduce。

job:用户提交的作业。一个job可能由一到多个task组成。

stage:job分成的阶段。一个job可能被划分为一到多个stage。

partition:数据分区。即一个rdd的数据可以划分为多少个分区。

narrowdependency:窄依赖,即子rdd依赖于父rdd中固定的partition。narrow-dependency分为onetoonedependency和rangedependency两种。

shuffledependency:shuffle依赖,也称为宽依赖,即子rdd对父rdd中的所有partition都有依赖。

dag(directed acycle

graph):有向无环图。用于反映各rdd之间的依赖关系。

3. scala与java的比较

spark为什么要选择java作为开发语言?笔者不得而知。如果能对二者进行比较,也许能看出一些端倪。表2-1列出了scala与java的比较。

表2-1 scala与java的比较

比项项     scala         java

语言类型          面向函数为主,兼有面向对象         面向对象(java8也增加了lambda函数编程)

简洁性      非常简洁     不简洁

类型推断          丰富的类型推断,例如深度和链式的类型推断、 duck type、隐式类型转换等,但也因此增加了编译时长         少量的类型推断

可读性      一般,丰富的语法糖导致的各种奇幻用法,例如方法签名         好

学习成本          较高     一般

语言特性          非常丰富的语法糖和更现代的语言特性,例如 option、模式匹配、使用空格的方法调用    丰富

并发编程          使用actor的消息模型      使用阻塞、锁、阻塞队列等

通过以上比较似乎仍然无法判断spark选择java作为开发语言的原因。由于函数式编程更接近计算机思维,因此便于通过算法从大数据中建模,这应该更符合spark作为大数据框架的理念吧!