但是,许多公司仍然使用MapReduce框架来进行批处理,而不是Spark。
因此,我想了解一下Spark作为Hadoop批处理框架目前存在哪些挑战?
有何看法?
Spark比MapReduce在迭代算法方面快上一个数量级,因为它从在本地JVM中缓存中间数据中获得了显著的加速。
随着Spark 1.1的推出,主要包括新的洗牌实现(基于排序的洗牌而不是基于哈希的洗牌),一个新的网络模块(基于netty而不是使用块管理器发送洗牌数据),一个新的外部洗牌服务,使Spark执行最快的PetaByte排序(在190个节点上,46TB RAM)和TeraByte排序打破了Hadoop的旧记录。
Spark可以轻松处理比集群的聚合内存大几个数量级的数据集。因此,我的想法是Spark正在朝着正确的方向发展,并且最终会变得更好。
有关参考,这篇博客文章解释了Databricks如何执行petabyte排序。
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的一些常见误解。
Spark只是一个内存集群计算框架。然而,这并不正确。当数据可以适应内存时,Spark表现很好,因为内存访问延迟较低。但即使数据集无法完全适应内存,也可以使其工作。
你需要学习Scala才能使用Spark。Spark是用Scala编写的,并在JVM上运行。但Spark提供对Java和Python中大多数常见API的支持。因此,即使不了解Scala,也可以轻松入门Spark。
Spark无法扩展。Spark仅适用于小型数据集(GB级),无法扩展到大量机器或TB级别的数据。这也不正确。它已成功用于排序PetaBytes的数据。
最后,如果您没有使用Hadoop MR的旧代码库,采用Spark是很明智的选择,原因很简单,所有主要的Hadoop供应商都在朝着Spark前进。
Apache Spark 运行在内存中,比 mapreduce 快得多。 Spark 最初是在伯克利进行的研究项目。
Mapreduce 广泛使用磁盘(用于外部排序、洗牌等)。
由于 Hadoop 作业的输入大小为几个 terabytes 的数量级,因此 Spark 对内存的需求将超过传统的 Hadoop。
因此,对于较小的作业和具有巨大内存的集群,Spark 获胜。但这在大多数集群中并不实际。
有关 Spark 的更多详细信息,请参阅 spark.apache.org。