作为通用的并行处理框架,Spark具有类似Hadoop的一些优点,而且Spark采用了更好的内存管理,在迭代计算上具有比Hadoop更高的效率,Spark还提供了更为广泛的数据集操作类型,大大方便了用户的开发,checkpoint的应用使Spark具有很强容错能力,众多优越的性能和比Hadoop更广泛的适用面让Spark的进一步发展值得期待。 Apache Spark现在名声大噪。为支持Spark项目成立的 Databricks公司 从Andereessen Horowittz那里募集了1400万美元,Cloudera也已决定全力支持Spark,还有众多其它公司也积极地加入这件大事。所以我觉得这正是我应该认真了解一下这场躁动的时候。 我研究了一段时间的Scala API(用Scala写的Spark),老实说一开始我很失望,因为Spark看起来真的太不起眼了。基本的抽象是Resilient Distributed Datasets(RDDs)和基本分布式不可变集,可以基于本地文件或通过HDFS存储在Hadoop上的文件定义,提供常用的Scala-style集合操作(如映射,foreach等)。 我的第一反应是"没搞错吧,这真是基本分布式集合吗?"。相比之下Hadoop就显得丰富多了:分布式文件系统,众所周知的Map Reduce,支持所有类型的数据格式、 数据源、单元测试、聚类变量等。 其他人很快就指出还有更多,事实上Spark也提供更复杂的操作(如join、依据操作分组或规约),这样你就可以为相当复杂的数据流建模(虽然没有迭代)。 随着时间的推移我恍然大悟,原来Spark所谓的简单其实说的大多是关于Hadoop中的Java API而不是Spark本身。即使是简单的例子在Hadoop中通常也会有大量的样板代码。但从概念上讲,Hadoop非常简单,它只提供了两种基本操作:并行的映射(Map)和规约(Reduce)操作。如果用相同的方式,对表示相似分布式集合,事实上将有更小的接口(有些项目像 Scalding就是处理类似的事情,并且代码看起来很类似Spark)。 Spark实际上提供了一组重要的操作,在这一点让我信服以后,我通过这个 论文进行了更深入的研究,它描述了通用的架构。RDDs 是Spark的基本构造模块,实际上真的很像分布式不可变集。这些定义的操作(如map或foreach),容易地进行并行处理;还有join运算,需要两个RDDs和收集基于一个共同键的条目;以及依据操作规约,通过用户指定基于键的函数来聚合条目。在单词计数示例中,计数一次就将文本映射到所有的单词,然后用键对他们进行规约,以此来实现字数统计。RDDs可以从磁盘中读取,然后为提高速度而保留在内存中,他们也可以被缓存,那样你就不需要每次都重读他们。仅那样就比Hadoop快了很多,这大部分是基于磁盘的速度。 容错机制也是Spark的亮点之一。取代给中间结果进行持久化或建立检查点,Spark会记住产生某些数据集的操作序列。因此,当一个节点出现故障时,Spark会根据存储信息重新构造数据集。他们认为这样也不错,因为其他节点将会帮助重建。 所以本质上,Spark相比纯粹的Hadoop,有更小的接口(可能在将来也会变得臃肿),但有许多基于之上的项目(例如像Twitter的 Scalding)达到了类似水平的表现。其他的主要区别是Spark默认情况下是在内存中,这自然带来性能上很大的改善,甚至允许运行的迭代算法。虽然Spark已也没有内置对迭代的支持,不过,就像他们宣称的那样:只要你想要,它就可以快到让你可以进行迭代。 |