在Hadoop上批处理,是选择MapReduce还是Spark?

5
我知道MapReduce是在Hadoop上进行批处理的一个伟大框架。但是,与MapReduce相比,Spark也可以作为在Hadoop上进行批处理的框架,提供可扩展性、容错性和高性能。Cloudera、Hortonworks和MapR也开始支持使用YARN将Spark集成到Hadoop中。
但是,许多公司仍然使用MapReduce框架来进行批处理,而不是Spark。
因此,我想了解一下Spark作为Hadoop批处理框架目前存在哪些挑战?
有何看法?

Hadoop -> 旧方式,Spark -> 新方式。 - maasg
你的集群里有足够的RAM吗?Spark非常喜欢RAM。MapReduce需要将所有数据都写入磁盘,支持更大的数据集。 - Remus Rusanu
你说:“但是,很多公司仍然在使用Hadoop上的MapReduce框架进行批处理,而不是Spark。” 你有任何数据支持这个说法吗? - Soumya Simanta
是的,我是这样认为的。基于数据,我提出了这个问题。但是,数据不能共享。我非常确信Spark更好,并且它将成为未来的主流。那么,公司现在不适应Spark是因为稳定性或其他原因吗? - Venkat Ankam
3个回答

6

Spark比MapReduce在迭代算法方面快上一个数量级,因为它从在本地JVM中缓存中间数据中获得了显著的加速。

随着Spark 1.1的推出,主要包括新的洗牌实现(基于排序的洗牌而不是基于哈希的洗牌),一个新的网络模块(基于netty而不是使用块管理器发送洗牌数据),一个新的外部洗牌服务,使Spark执行最快的PetaByte排序(在190个节点上,46TB RAM)和TeraByte排序打破了Hadoop的旧记录。

Spark可以轻松处理比集群的聚合内存大几个数量级的数据集。因此,我的想法是Spark正在朝着正确的方向发展,并且最终会变得更好。

有关参考,这篇博客文章解释了Databricks如何执行petabyte排序。


5
我假设你说的Hadoop是指HDFS。
相对于Hadoop MR,使用Spark有许多好处。
1. 性能:Spark至少与Hadoop MR一样快。对于需要执行同一数据集的多次迭代算法,它可以快数个数量级。Map-reduce会将每个阶段的输出写入HDFS。
1.1. Spark可以缓存(根据可用内存)这些中间结果,从而减少因磁盘IO引起的延迟。
1.2. Spark操作是惰性的。这意味着在开始处理数据之前,Spark可以执行某些优化,因为它可以重新排序操作(因为它们尚未执行)。
1.3. Spark保留操作的血统,并基于此血统重新创建部分故障状态以进行恢复。
2. 统一生态系统:Spark为各种类型的分析提供了统一的编程模型 - 批处理(spark-core),交互式(REPL),流式(spark-streaming),机器学习(mllib),图形处理(graphx),SQL查询(SparkSQL)。
3. 更丰富和简单的API:Spark的API更丰富也更简单。更丰富是因为它支持更多的操作(例如groupBy、filter等)。更简单是由于这些函数构造的表达能力。Spark的API支持Java、Scala和Python(大多数API)。R有实验性支持。
4. 多种数据存储支持:Spark支持许多数据存储。您可以使用Spark在普通或分布式文件系统、HDFS、Amazon S3、Apache Cassandra、Apache Hive和ElasticSearch等中分析数据。我相信支持许多其他流行的数据存储即将到来。这意味着如果您想采用Spark,您不必搬移数据。
例如,下面是Spark(Scala)中的单词计数代码。
val textFile = sc.textFile("some file on HDFS")
val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)

如果你使用标准的Hadoop MR,那么你可能需要写更多的代码。

以下是关于Spark的一些常见误解。

  1. Spark只是一个内存集群计算框架。然而,这并不正确。当数据可以适应内存时,Spark表现很好,因为内存访问延迟较低。但即使数据集无法完全适应内存,也可以使其工作。

  2. 你需要学习Scala才能使用Spark。Spark是用Scala编写的,并在JVM上运行。但Spark提供对Java和Python中大多数常见API的支持。因此,即使不了解Scala,也可以轻松入门Spark。

  3. Spark无法扩展。Spark仅适用于小型数据集(GB级),无法扩展到大量机器或TB级别的数据。这也不正确。它已成功用于排序PetaBytes的数据

最后,如果您没有使用Hadoop MR的旧代码库,采用Spark是很明智的选择,原因很简单,所有主要的Hadoop供应商都在朝着Spark前进。


我的问题是为什么许多公司今天更喜欢使用MR而不是Spark进行批处理。所有新项目(批处理)都只采用MR实现。为什么不使用Spark?是因为Spark不如MR稳定吗?还是有其他挑战? - Venkat Ankam
很抱歉,这是一个难以回答的问题。哪些数据显示公司正在选择MR而不是Spark?在我看来,许多公司使用MR是因为它比Spark存在更久。Spark仍然没有成为主流,但我没有看到任何其他原因阻止它成为主流。在我上面的回答中,我试图给出一些关键的“技术”原因,说明我认为Spark比MR更好,并且为什么它有可能在未来取代MR。 - Soumya Simanta
我同意Soumya的观点,时间可能是采用Apache Spark时最重要的因素。 当64位架构被引入时,人们也没有立即切换他们的操作系统,因为迁移总是复杂和有风险的。对于那些最初使用MR的公司来说,情况也是一样,现在他们慢慢开始寻找其他替代方案。 我不知道今天是否还有很多公司决定使用MR而不是像Spark这样的下一代运行时。 - Robert Metzger

0

Apache Spark 运行在内存中,比 mapreduce 快得多。 Spark 最初是在伯克利进行的研究项目。

Mapreduce 广泛使用磁盘(用于外部排序、洗牌等)。

由于 Hadoop 作业的输入大小为几个 terabytes 的数量级,因此 Spark 对内存的需求将超过传统的 Hadoop。

因此,对于较小的作业和具有巨大内存的集群,Spark 获胜。但这在大多数集群中并不实际。

有关 Spark 的更多详细信息,请参阅 spark.apache.org。


1
“Apache Spark在内存中运行” - 我认为这并不完全正确。如果您的数据集适合内存,Spark会表现得最佳。但是即使数据集不适合内存,它仍然能够处理操作。在大多数情况下,Spark与Hadoop MapReduce一样快速。 - Soumya Simanta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接