何海林1,2,皮建勇1,2
1.贵州大学 计算机科学与信息学院,贵州 贵阳 550025; 2.贵州大学 云计算与物联网研究中心,贵州 贵阳 550025
摘 要: 虽然以MapReduce和Hadoop分布式系统(HDFS)为核心的Hadoop已在大规模数据密集的商业领域成功应用,但是对于多个并行操作之间重用工作数据集却表现不佳。作为对其的一种补充,本文介绍了Spark。首先介绍Hadoop的MapReduce与HDFS基本概念与设计思想,然后介绍了Spark的基本概念与思想,并且着重介绍了弹性分布式数据集RDD,并通过实验证明和分析对比了Hadoop与Spark。
关键词: Hadoop;MapReduce;HDFS;Spark;弹性分布式数据集
0 引言
在这个知识爆炸性增长的社会,随着各种技术的进步,人们越来越依赖身边的各种终端设备进行各种各样的生产生活,而这些设备会产生大量的数据。如何从这些数据中高效地获得有用信息成为一个有经济价值的问题。Hadoop[1]凭借其良好的出身与优越的性能,如高可靠性、高可扩展性、高效性,并且它是开源的,已经成为大数据分析的标准框架。但是Hadoop并不适用于所有场合,它有其本身不可克服的缺点,如访问时间延迟过长不适用于时间要求较高的应用,代码越来越长限制了它更大规模的应用。这时候Spark[2]异军突起,克服了Hadoop的众多缺点。
1 Hadoop
Hadoop是Apach的一个开源项目,Hadoop提供了一个分布式文件系统(HDFS)[3]和一个用于分析和转化大规模数据集的MapReduce[4]框架,Hadoop的一个重要特点就是通过对数据进行分割在多台主机上进行运行,并且并行地执行应用计算。其中HDFS用于存储数据,MapReduce是Google公司的一项重要技术,后被模仿,它主要采用并行计算的方法用于对大数据的计算。它们之间的关系如图1。以Hadoop分布式文件系统和MapReduce分布式计算框架为核心,为用户提供了底层细节透明的分布式基础设施。HDFS的高容错性和高弹性的优点,允许用户将其部署到廉价的机器上,构建分布式系统。MapReduce分布式计算框架允许用户在不了解分布式系统底层细节的情况下开发并行分布的应用程序,充分利用大规模的计算资源,解决传统单机无法解决的大数据处理问题。
1.1 MapReduce编程模型
正与其名字一样,MapReduce包含两项关键操作:Map与Reduce,两者来源于函数式编程语言,并且作为MapReduce的两项核心操作由用户编程完成。如图2,MapReduce模型包含Map、Shuffle和Reduce三个阶段。
Map阶段:输入数据被系统分为相互独立的片块,这些小块同时被Map处理,在用户指定的Map程序中执行,最大限度地利用并行处理产生结果,最后Map阶段的输出作为Reduce阶段的输入。
Shuffle阶段:将具有相同键的记录送到同一个Reduce。
Reduce阶段:将Shuffle的输出作为输入进行处理产生最终结果。
在MapReduce中的处理主要靠键值对实现。例如输入的记录用<Key1,Value1>表示,在Map阶段读入记录处理产生结果,Map阶段的输出用模式<Key2,Value2>表示,如果几个记录需要在Reduce阶段一起处理,那么这些记录就会被同一个Reduce处理,在Shuffle阶段,将具有相同键的送到同一个Reduce,这样,在Reduce阶段Map阶段的输出被最终输出为<Key3,Value3>。可以用下面的式子表示:
Map:(K1,V1)->list(K2,V2)
Reduce:(K2,list(V2))->list(K3,V3)
1.2 HDFS
HDFS当初被发展主要是为了实现与GFS[5]相似的功能,HDFS是Hadoop的文件系统的组件,它的接口与UNIX文件系统相似,牺牲了标准,是为了提高应用的性能。
HDFS正如GFS一样将系统数据与应用数据分开进行存放。存放元数据在专门的服务器上,叫做NameNode,应用数据存放在其他服务器上叫做DataNode,所有的服务器通过TCP协议来进行连接。不同于Lustre[6]与PVFS[7],数据节点在HDFS不采用数据保护机制,例如磁盘阵列RAID来确保数据的持久性,而是采用与GFS类似的方式将数据目录复制到多个数据节点来保证其可靠性,并能保证数据的持久性,这种策略恰好又让数据传输的带宽提高了多倍,可以让数据存放在离局部计算更近的地方,几个分布式文件系统或多或少地实现了命名空间。
2 Spark
Spark诞生于美国加州理工大学AMPLab集群计算平台,利用内存计算速度快的特点,并从MapReduce不适用于在多个并行操作之间重用工作数据集(多迭代批量处理与交互式数据分析)的特点出发,在流处理和图计算等多种计算范式具有更加强的能力。由此提出了一种新的架构叫做Spark,用于处理迭代机器学习算法,以保持像MapReduce一样的高扩展性与容错能力。Spark引入了RDD,即弹性分布式数据集(resilient distributed datasets,RDD)[8]。
Spark是通过Scala[9]实现的一种基于Java虚拟机的高级编程语言,提供类似于DryadLINQ的编程接口,这样编写并行任务变得非常方便。同时Spark还可以修改Scala的编译器,与Ruby和Python一样,Scala也提供了一个交互式shell。实现时间延迟减少的方法主要是基于内存的数据,通过允许用户从解释器交互式地运行Spark,从而可以在大数据集上实现大规模并行数据挖掘。虽然现阶段Spark还是一个原型,但是前途还是令人鼓舞的。实验表明,在处理迭代式应用上Spark比Hadoop的速度提高20多倍,计算数据分析类报表的性能提高了40多倍,在交互式查询39 GB数据集时可以达到次秒级响应时间。
Spark应用称为driver,实现单个节点或多个节点上的操作。与Hadoop一样,Spark支持单节点和多节点集群,可以在Hadoop文件系统中并行运行。通过名为Mesos[10]的第三方集群框架可以支持此行为。这种配置的优点是:允许Spark与Hadoop共用一个节点共享池,扩大了应用范围。
要想使用Spark,开发者需要编写一个Driver程序,连接到集群以运行worker,如图3所示。Driver定义了一个或多个RDD,并调用RDD上的动作。worker是长时间运行的进程,将RDD分区以Java对象的形式缓存在内存中。
RDD是一种分布式的内存抽象。Spark引入的RDD采用了Scala编程风格,因为Scala特性决定了RDD是一个Scala表示的对象,RDD不需要存在于物理存储中。RDD的一个句柄包含足够的信息计算RDD,这就意味着RDD可以以四种方式重建[11]:
(1)改变已有RDD的持久性,RDD是懒散和短暂的,数据集在进行并行操作时已经按照要求进行了实例化(如请求将已有RDD缓存在内存中,之后会被抛出内存)。
(2)从其他RDD转换得来,一个数据集元素类型为A可以通过调用flatmap转换为数据类型B。
(3)将Driver中Scala的集合划分为并行切片,分布在各个节点之间。
(4)一个从文件系统创建的Scala对象。
RDD的以上操作决定了它有数据流的特点,比如:位置感知调度、强大的自动容错,以及很好的可伸缩性。这样在有多个查询请求时Spark会将工作集缓存在内存中,如果内存不够用,可以写到硬盘上,后续查询时提高了重用度,可以让查询速度有质的提升。
3 实验
3.1 实现设置
本次实验采用4 000家餐厅140万条点评数据,先预处理,再通过运行K-means算法[12]将数据分为四类,对比在两种平台上的迭代时间。K-means算法是聚类算法中最简单的一种,它需要不断地迭代直到收敛。
设备:3台内存为2 GB、硬盘为500 GB的PC安装搭建Hadoop后再安装Spark,其中K-means的Scala的主要代码为:
val sparkConf=new SparkConf().setAppName("SparkKMeans")
val sc=new SparkContext(sparkConf)
val lines=sc.textFile(args(0))
迭代时间花费如图4所示。
3.2 结果分析与两者对比
在搭建实验环境与编写实验程序阶段可以看出,Spark提供了与Scala、Java、Python编程一样的高级API,这样便于开发并发处理应用程序。Hadoop每一次迭代会在工作集上反复调用一个函数,每一次迭代都可以看做是Mapduce的任务,每一次任务的执行,都需要从硬盘重新下载数据,这会显著地增加时间延迟,而Spark却不用从硬盘调用,只需从内存调用。
两者对比,Spark相较于Hadoop最显著的特征就是快,Spark对于小数据集能够达到亚秒级的延迟,这相对于Hadoop MapReduce由于“心跳机制”要花费数秒的性能而言无疑是飞跃,Hadoop经常被用于在大数据上通过Sql接口(如Pig和Hive)运行Ad-hoc探索性查询,实际上用户可以将数据集装载到内存进行查询,然而,Hadoop通过MapReduce任务进行,由于反复从硬盘读取数据,因此它的延迟非常大。其次,首先安装的是Hadoop,最后安装的是Spark,后者借助前者的基础,与其实现了完美融合,凭借Scala(被业界誉为未来Java的取代者)的强大功能,Scala能运行在运行JVM的任何地方,还可以充分利用大量现存的Java库和现有的Java代码。因此,Spark只需要稍作修改,就可以交互式编程。通过对比代码数量可以发现,由于Scala的简洁性以及Spark非常好地利用了Hadoop和Mesos的基础设施,Spark代码量明显少了许多。
4 结束语
本文介绍了Hadoop与Spark的基本概念与设计思想。可以看出Spark实际上作为对Hadoop的一种补充,在处理迭代工作与交互式数据分析方面具有优越性。两者开始显现出一种融合的趋势,从Hadoop 0.23把MapReduce做成库开始,Hadoop的目标就是要支持包括MapReduce在内的更多的并行计算模型,比如MPI、Spark等。未来随着技术的发展究竟谁会被取代很难预料,应当取长补短,优势互补。新的需求会产生新的平台,如为了强调实时性而发展的Storm[13],常用于实时性要求较高的地方。未来如何实现更多融合,是一个值得发展的方向。
参考文献
[1] WHITE T. Hadoop: the definitive guide: the definitive guide[Z]. O′Reilly Media, Inc., 2009.
[2] INCUBATOR A. Spark: Lightning-fast cluster computing[Z]. 2013.
[3] SHVACHKO K, KUANG H, RADIA S, et al. The hadoop distributed file system[C].Mass Storage Systems and Technologies(MSST), 2010 IEEE 26th Symposium on. IEEE, 2010:1-10.
[4] DEAN J, GHEMAWAT S. MapReduce: simplified data processing on large clusters[J]. Communications of the ACM, 2008,51(1):107-113.
[5] GHEMAWAT S, GOBIOFF H, LEUNG S T. The Google file system[C]. ACM SIGOPS operating systems review, ACM, 2003,37(5):29-43.
[6] BRAAM P J. The Lustre storage architecture[Z]. 2004.
[7] ROSS R B, THAKUR R. PVFS: A parallel file system for Linux clusters[C]. Proceedings of the 4th annual Linux showcase and conference, 2000:391-430.
[8] ZAHARIA M, CHOWDHURY M, DAS T, et al. Resilient distributed datasets: a fault-tolerant abstraction for in-memory cluster computing[C]. Proceedings of the 9th USENIX Conference on Networked Systems Design and Implementation. USENIX Association, 2012:2-2.
[9] ODERSKY M, SPOON L, VENNERS B. Programming in scala[M]. Artima Inc, 2008.
[10] HINDMAN B, KONWINSKI A, ZAHARIA M, et al. Mesos: a platform for Fine-Grained resource sharing in the data center[C]. NSDI, 2011: 22-22.
[11] ZAHARIA M, CHOWDHURY M, FRANKLIN M J, et al. Spark: cluster computing with working sets[C]. Proceedings of the 2nd USENIX conference on hot topics in cloud computing, 2010:10.
[12] WAGSTAFF K, CARDIE C, ROGERS S, et al. Constrained k-means clustering with background knowledge[C]. ICML, 2001:577-584.
[13] MARZ N. Storm: distributed and fault-tolerant realtime computation[Z]. 2013.