Apache Spark和Hadoop有何不同之处?

5

大家都说Spark使用内存,因此比Hadoop快得多。

从Spark文档中,我不理解真正的差别在哪里。

  • Spark将数据存储在内存中,而Hadoop则不是这样做的。
  • 如果数据太大而无法存储在内存中,会发生什么?在这种情况下,它与Hadoop有多相似?
2个回答

5
在Hadoop MapReduce中,输入数据在磁盘上,您执行一个“映射”和一个“减少”,然后将结果放回磁盘。Apache Spark允许更复杂的管道。也许你需要进行两次“映射”,但不需要进行“减少”。也许您需要先“减少”,然后再“映射”,然后再次“减少”。Spark API使设置具有数十个步骤的非常复杂的管道变得非常直观。
您也可以使用MapReduce实现相同的复杂管道。但是,在每个阶段之间写入磁盘并读取它会产生开销。Spark避免了可能的开销。将数据保留在内存中是一种方法。但很多时候甚至都不必要。一个阶段只需将计算出的数据传递给下一个阶段,而无需在任何地方存储整个数据。
这在MapReduce中不是一个选项,因为一个MapReduce不知道下一个MapReduce。必须完全完成才能开始下一个。这就是为什么Spark对于复杂计算可能更有效的原因。
API在Scala中特别干净。经典的MapReduce通常只有一行代码。使用它非常强大。

为了完成这个答案:Spark使用一种名为“弹性分布式数据集”的自定义数据结构,可以显式地存储在内存中。如果RDD不适合内存,则以优雅的方式将其“溢出”到驱动器中(即不能放入内存的内容转移到磁盘中)。Spark最初是为迭代计算而设计的,可以执行(可能)长时间的操作流水线。Hadoop必须使用诸如Tez之类的工具来编排这样的管道,而无需来回访问磁盘。 - Bacon
另外,Spark将RDD上的转换记录为DAG,并且可以对其进行优化,这在您关于复杂计算的答案中提到了。 - qwr

5
Spark试图将数据保留在内存中,而MapReduce则不断地将数据从磁盘中取出并写回。这意味着Spark的中间输出结果存储在主内存中,而Hadoop则将中间结果存储在辅助内存中。MapReduce需要插入障碍,并且将数据写回磁盘和从磁盘读取数据需要很长时间,因此它可能会变得缓慢和繁琐。而Spark消除了这个限制,使其速度比MapReduce快得多。对于诸如Hive等SQL引擎,通常需要执行一系列MapReduce操作,这就需要大量的I/O活动。当在Spark上运行类似操作时,Spark可以在没有I/O的情况下将数据保留在内存中,因此您可以快速地操作相同的数据。这大大提高了性能,这意味着Spark至少移动到了交互类别。值得一提的是,MapReduce记录所有内容到磁盘上也有一些好处——因为将所有东西都记录到磁盘上允许在失败后重新启动。如果您正在运行一个多小时的作业,则不希望从头开始再次开始。对于在几秒钟或几分钟内运行的Spark应用程序,重新启动显然不是问题。
开发Spark更容易。Spark在指令执行方面更强大和更具表现力。Spark具有Map和Reduce函数,类似于MapReduce,但它还添加了其他函数,如Filter、Join和Group-by,因此开发Spark更容易一些。
Spark also adds libraries for doing things like machine learning, streaming, graph programming and SQL

如果数据太大无法存储在内存中会发生什么?在这种情况下,它与Hadoop有多相似? - member555
Spark会将部分结果(中间输出而非整个数据)缓存到其分布式工作节点的内存中,从而实现显著更快/低延迟的计算。如果中间数据在这种情况下无法适应内存,则Spark会将中间数据存储在磁盘上。 - Kishore
Spark允许您将中间结果缓存在内存中。如果您有经常使用的数据结构,例如查找表或机器学习算法中的分数矩阵,则缓存可以显着提高性能。但是,缓存也可能会引入问题,因为它通常需要大量的内存块。 - Kishore

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