最近不少人都在讨论Spark这个貌似通用的分布式计算模型,国内不少机器学习相关工做者都在研究和使用它。html
Spark是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发。web
那么Spark和Hadoop有什么不一样呢?算法
1.Spark的中间数据放到内存中,对于迭代运算效率比较高。编程
Spark aims to extend MapReduce for iterative algorithms, and interactive low latency data mining. One major difference between MapReduce and Sparkis that MapReduce is acyclic. That is, data flows in from a stable source, isprocessed, and flows out to a stable filesystem. Spark allows iterative computation on the same data, which would form a cycle if jobs were visualized. (旨在延长MapReduce的迭代算法,和互动低延迟数据挖掘的。 MapReduce和Sparkis的一个主要区别,MapReduce是非周期性。也就是说,数据流从一个稳定的来源,加工,流出到一个稳定的文件系统。“Spark容许相同的数据,这将造成一个周期,若是工做是可视化的迭代计算。)缓存
Spark更适合于迭代运算比较多的ML和DM运算。由于在Spark里面,有RDD的概念。网络
Resilient Distributed Dataset (RDD) serves as an abstraction to rawdata, and some data is kept in memory and cached for later use. This last pointis very important; Spark allows data to be committed in RAM for an approximate20x speedup over MapReduce based on disks. RDDs are immutable and created through parallel transformations such as map, filter, groupBy and reduce. (弹性分布式数据集(RDD)做为原始数据的抽象,和一些数据保存在内存中缓存供之后使用。最后这点很重要;星火容许在RAM致力于为近似20X基于加速了MapReduce的磁盘上的数据。RDDs是不可改变的,并经过并行转换,如地图,过滤器,GroupBy和减小建立的。)app
RDD能够cache到内存中,那么每次对RDD数据集的操做以后的结果,均可以存放到内存中,下一个操做能够直接从内存中输入,省去了MapReduce大量的磁盘IO操做。这对于迭代运算比较常见的机器学习算法来讲,效率提高比较大。可是因为Spark目前只是在UC Berkeley的一个研究项目,目前看到的最大规模也就200台机器,没有像Hadoop那样的部署规模,因此,在大规模使用的时候仍是要慎重考虑的。框架
2.Spark比Hadoop更通用。机器学习
Spark提供的数据集操做类型有不少种,不像Hadoop只提供了Map和Reduce两种操做。好比map, filter, flatMap,sample, groupByKey, reduceByKey, union, join, cogroup, mapValues, sort,partionBy等多种操做类型,他们把这些操做称为Transformations。同时还提供Count, collect, reduce, lookup, save等多种actions。异步
这些多种多样的数据集操做类型,给上层应用者提供了方便。各个处理节点之间的通讯模型再也不像Hadoop那样就是惟一的Data Shuffle一种模式。用户能够命名,物化,控制中间结果的分区等。能够说编程模型比Hadoop更灵活。
不过论文中也提到,Spark不适用那种异步细粒度更新状态的应用,例如web服务的存储或者是增量的web爬虫和索引。就是对于那种增量修改的应用模型,固然不适合把大量数据拿到内存中了。增量改动完了,也就不用了,不须要迭代了。
3.容错性。
从Spark的论文《Resilient Distributed Datasets: AFault-Tolerant Abstraction for In-Memory Cluster Computing》中没看出容错性作的有多好。却是提到了分布式数据集计算,作checkpoint的两种方式,一个是checkpoint data,一个是logging the updates。貌似Spark采用了后者。可是文中后来又提到,虽而后者看似节省存储空间。可是因为数据处理模型是相似DAG的操做过程,因为图中的某个节点出错,因为lineage chains的依赖复杂性,可能会引发所有计算节点的从新计算,这样成本也不低。他们后来讲,是存数据,仍是存更新日志,作checkpoint仍是由用户说了算吧。至关于什么都没说,又把这个皮球踢给了用户。因此我看就是由用户根据业务类型,衡量是存储数据IO和磁盘空间的代价和从新计算的代价,选择代价较小的一种策略。
4.关于Spark和Hadoop的融合
不知道Apache基金会的人怎么想的,我看Spark仍是应该融入到Hadoop生态系统中。从Hadoop 0.23把MapReduce作成了库,看出Hadoop的目标是要支持包括MapReduce在内的更多的并行计算模型,好比MPI,Spark等。毕竟如今Hadoop的单节点CPU利用率并不高,那么假如这种迭代密集型运算是和现有平台的互补。同时,这对资源调度系统就提出了更高的要求。有关资源调度方面,UC Berkeley貌似也在作一个Mesos的东西,还用了Linux container,统一调度Hadoop和其余应用模型。
转自网络:http://tech.it168.com/a2012/0401/1333/000001333287.shtml