Spark和Hadoop之间的主要技术差异和选择


Hadoop 和 Spark 都是开源软件的集合,由 Apache 软件基金会维护,用于大规模数据处理。Hadoop 是两者中较老的一个,曾经是处理大数据的首选。然而,自从 Spark 推出以来,它的增长速度远快于 Hadoop,后者不再是该领域无可争议的领导者。
随着 Spark 的普及,在Spark和 Hadoop 之间进行选择是现实世界中许多公司面临的问题。不幸的是,这个问题的答案并不简单。两种系统都有优点和缺点,正确的选择将取决于相关用例的复杂性。

Spark导致了某些任务的大规模提速。其主要技术原因是,Spark在RAM(随机存取存储器)中处理数据,而Hadoop则在磁盘上读写文件(我们在此注意到,Spark可以使用HDFS作为数据源,但仍将在RAM中处理数据,而不是像Hadoop那样在磁盘上处理)。RAM要比磁盘快得多,原因有二:

  • 首先,RAM使用固态技术来存储信息,而磁盘是通过磁力来存储。
  • 其次,与存储在磁盘上的信息相比,RAM离CPU更近,连接速度也更快,因此RAM中的数据被访问的速度更快。

这种技术上的差异导致同一数据集被多次重复使用的应用程序的速度提高了很多个数量级。Hadoop导致这些任务的显著延迟(延迟),因为每次查询都需要一个单独的MapReduce作业,这涉及到每次从磁盘重新加载数据。
然而,在Spark中,数据保持在RAM中,所以从那里而不是磁盘中读取。这导致Spark在某些情况下表现出比Hadoop快100倍的速度,在这些情况下我们会多次重复使用相同的数据。因此,在这样的情况下,我会选择Spark而不是Hadoop。常见的例子是迭代作业和互动分析。
  
反复使用同一数据集的迭代任务的一个具体和非常常见的例子是机器学习(ML)模型的训练。ML模型的训练通常是通过反复传递相同的训练数据集,以尝试通过使用梯度下降等优化算法达到误差函数的全局最小值。在这样的任务中,Spark实现的性能提升水平在数据被查询的次数越多时就越突出。例如,如果你在Hadoop和Spark上训练一个ML模型,只使用一次数据(epoch),就不会有明显的加速,因为数据需要从磁盘加载到RAM,以便在Spark上进行第一次迭代。然而,Spark上的每个后续迭代将在一小部分时间内运行,而Hadoop的每个后续迭代将花费与第一次迭代相同的时间,因为每次都要从磁盘上检索数据。因此,在处理ML应用时,Spark通常比Hadoop更受欢迎。
 
尽管在许多应用中这是一个巨大的优势,但值得注意的是,在有些情况下,Spark的内存计算会有缺陷。例如,如果我们所处理的数据集非常大,以至于超过了可用的RAM,那么Hadoop就是首选。
此外,同样由于内存和磁盘的差异,Hadoop与Spark相比,在扩展方面相对容易和便宜。因此,尽管时间有限的企业可能最好使用Spark,但有资本限制的企业可能更好地使用Hadoop更便宜的设置和可扩展性。