<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作为大数据框架的理念吧!