为啥 Spark 比 Hadoop Map Reduce 快

Posted

技术标签:

【中文标题】为啥 Spark 比 Hadoop Map Reduce 快【英文标题】:Why is Spark faster than Hadoop Map Reduce为什么 Spark 比 Hadoop Map Reduce 快 【发布时间】:2015-09-14 19:34:31 【问题描述】:

有人可以用字数的例子来解释一下,为什么 Spark 会比 Map Reduce 更快?

【问题讨论】:

Why is Spark fast when word count? 的可能重复项 另一个可能的重复Is caching the only advantage of spark over map-reduce? 【参考方案1】:

bafna 的回答提供了故事的记忆方面,但我想补充另外两个重要事实:DAG 和生态系统

    Spark 使用“惰性评估”来形成连续计算阶段的有向无环图 (DAG)。通过这种方式,可以优化执行计划,例如最大限度地减少洗牌数据。相反,这应该通过调整每个 MR 步骤在 MapReduce 中手动完成。 (如果您熟悉 RDBMS 中的执行计划优化或 Apache Tez 的 DAG 式执行,则更容易理解这一点) Spark 生态系统已经建立了一个通用的组件堆栈来处理 SQL、ML、流、图挖掘任务。但在 hadoop 生态系统中,您必须安装其他软件包才能完成这些单独的操作。

我想补充一点,即使您的数据对于主内存来说太大,您仍然可以通过选择将数据持久保存在磁盘上来使用 spark。尽管这样做会放弃内存中处理的优势,但您仍然可以从 DAG 执行优化中受益。

关于 Quora 的一些信息性答案: here 和 here。

【讨论】:

【参考方案2】:

我认为有三个主要原因。

主要的两个原因源于这样一个事实,即通常不是运行单个 MapReduce 作业,而是按顺序运行一组作业。

    MapReduce 的主要限制之一是它在运行每个作业后将完整的数据集持久化到 HDFS。这是非常昂贵的,因为它会导致磁盘 I/O 中数据集大小的三倍(对于复制)和类似数量的网络 I/O。 Spark 对操作管道采取了更全面的看法。当一个操作的输出需要馈送到另一个操作时,Spark 直接传递数据而不写入持久存储。这是对 MapReduce 的一项创新,来自 Microsoft 的 Dryad 论文,并非 Spark 的原创。

    Spark 的主要创新是引入了内存缓存抽象。这使得 Spark 非常适合多个操作访问相同输入数据的工作负载。用户可以指示 Spark 将输入数据集缓存在内存中,这样就不需要每次操作都从磁盘读取。

    如果 Spark 作业可以归结为一个 MapReduce 作业呢?在许多情况下,这些在 Spark 上的运行速度也比在 MapReduce 上更快。 Spark 在这里的主要优势是它可以更快地启动任务。 MapReduce 为每个任务启动一个新的 JVM,这可能需要几秒钟的时间来加载 JAR、JITing、解析配置 XML 等。Spark 会在每个节点上保持一个执行程序 JVM,因此启动任务只需对其进行 RPC 和将 Runnable 传递给线程池,该线程池需要毫秒的个位数。

最后,一个可能值得一提的常见误解是 Spark 以某种方式完全在内存中运行,而 MapReduce 则不然。这根本不是那么回事。 Spark 的 shuffle 实现与 MapReduce 的工作方式非常相似:每条记录在 map 端被序列化并写入磁盘,然后在 reduce 端被提取和反序列化。

【讨论】:

最好的答案,现在有了 Spark 的第二个版本,我认为您还可以提及 Tungsten 引擎。它使用 MapReduce 中不可用的字节码优化。 答案由Sandy Ryza原创,请看这里qr.ae/pNySpA

以上是关于为啥 Spark 比 Hadoop Map Reduce 快的主要内容,如果未能解决你的问题,请参考以下文章

Spark详细总结

有spark为啥还要hive

Spark系列:Spark为什么比Hadoop快

spark为什么比hadoop的mr要快?

spark与hadoop相比,存在哪些缺陷

通俗说Spark