有人可以解释使用单词计数示例,为什么Spark会比Map Reduce更快?
答案 0 :(得分:17)
bafna的回答提供了故事的记忆方面,但我想补充其他两个重要事实:DAG和生态系统
我想补充一点,即使您的数据对于主内存而言太大,您仍然可以通过选择将数据保留在磁盘上来使用spark 。虽然通过这样做可以放弃内存处理的优势,但您仍然可以从DAG执行优化中受益。
答案 1 :(得分:11)
我认为有三个主要原因。
主要的两个原因源于这样一个事实:通常,一个人不会运行单个MapReduce作业,而是按顺序运行一组作业。
MapReduce的一个主要限制是它在运行每个作业后将完整数据集保留到HDFS。这非常昂贵,因为它会导致磁盘I / O中数据集大小的三倍(用于复制)和类似数量的网络I / O. Spark更全面地了解了一系列操作。当需要将操作的输出馈送到另一个操作时,Spark直接传递数据而不写入持久存储。这是MapReduce的一项创新,来自微软的Dryad论文,并不是Spark的原创。
Spark的主要创新是引入内存缓存抽象。这使Spark成为多个操作访问相同输入数据的工作负载的理想选择。用户可以指示Spark将输入数据集缓存在内存中,因此不需要为每个操作从磁盘读取它们。
那些可以归结为单个MapReduce作业的Spark作业怎么样?在许多情况下,这些在Spark上运行速度比在MapReduce上运行得快。 Spark在这方面的主要优势是它可以更快地启动任务。 MapReduce为每个任务启动一个新的JVM,加载JAR,JITing,解析配置XML等需要几秒钟.Spark会在每个节点上运行执行程序JVM,因此启动任务只需要对它进行RPC和将Runnable传递给线程池,该线程池采用毫秒的单个数字。
最后,一个常见的误解可能值得一提的是,Spark在某种程度上完全在内存中运行,而MapReduce则没有。这根本不是那么回事。 Spark的shuffle实现与MapReduce的工作方式非常相似:每个记录都被序列化并在映射端写入磁盘,然后在reduce端进行提取和反序列化。