【问题标题】:How does Apache Spark achieve a 100x speedup over Hadoop MapReduce and in what scenarios?Apache Spark 如何在 Hadoop MapReduce 上实现 100 倍的加速以及在什么场景下?
【发布时间】:2016-03-10 01:45:47
【问题描述】:
Apache Spark [http://spark.apache.org/] 声称在内存中比 Apache Hadoop 快 100 倍。它是如何实现这种惊人的加速的?这种加速是否仅适用于迭代机器学习算法,或者也适用于 JOIN 和 GROUPBY 等 ETL(提取-转换-加载)任务? Spark 的 RDD(弹性分布式数据集)和 DataFrame 都可以提供这种加速吗? Spark 社区是否针对上述某些场景获得了任何基准测试结果?
【问题讨论】:
标签:
hadoop
apache-spark
bigdata
distributed-computing
【解决方案1】:
- Spark 在内存中进行数据处理。
- 不会像 Map Reduce 那样有中间文件,所以没有 I/O 或可以忽略不计。
- 在所有情况下,它的运行速度都不是 100 倍,尤其是在涉及连接和排序时。
- 因为它是内存密集型的,它可以快速饱和集群。您可能能够在给定时间点以 100 倍的速度运行一项作业,但无法运行使用传统 hadoop 方法可以运行的尽可能多的作业/应用程序。
- RDD 和数据帧是用于处理数据的内部数据结构。 RDD 是数据的内存数据结构,数据帧主要是这些 RDD 的元数据。它们更多地代表 spark 中的数据。
这些声明中的大多数问题都没有针对真实的生产用例进行基准测试。可以代表实际业务应用程序的数据可能有数量,但没有质量。 Spark 可以非常方便地用于流式分析,您希望在其中近乎实时地了解数据。但对于真正的批处理,Hadoop 可能是更好的解决方案,尤其是在商用硬件上。
【解决方案2】:
由于内存处理,Spark 比 Hadoop 更快。但是关于这些数字有一些扭曲的事实。
在某些用例中,Spark 仍然必须依赖 HDFS。
看看这个slide,尤其是幻灯片编号:6和这个benchmarking article
看看完整的演示文稿。
由于内存处理,Spark 的实时分析速度更快。 Hadoop 适用于批处理。如果您不担心作业的延迟,仍然可以使用 Hadoop。
但有一件事是肯定的。 Spark 和 Hadoop 必须共存。他们都不能替代其他人。
【解决方案3】:
Apache Spark 处理内存中的数据,而 Hadoop MapReduce 在执行映射或归约操作后保留回磁盘。但 Spark 需要大量内存
Spark 将进程加载到内存中并保留在那里,直到另行通知为止,以进行缓存。
弹性分布式数据集 (RDD),可让您透明地将数据存储在内存中,并在需要时将其持久化到磁盘中。
由于 Spark 使用内存,所以没有同步障碍会拖慢您的速度。这是 Spark 表现出色的主要原因。
Spark 不仅可以像 MapReduce 那样处理一批存储的数据,还可以使用 Spark Streaming 实时处理数据。
DataFrames API 的灵感来自 R 和 Python (Pandas) 中的数据帧,但从头开始设计为现有 RDD API 的扩展强>.
DataFrame 是组织成命名列的分布式数据集合,但在底层具有更丰富的优化,支持 spark 的速度。 p>
使用 RDD 的 Spark 可以简化复杂的操作,例如 join 和 groupBy,而在后端,您可以处理碎片数据.正是这种碎片化使得 Spark 能够并行执行。
Spark 允许使用有向无环图 (DAG) 模式开发复杂的多步骤数据管道。它支持跨 DAG 共享内存中的数据,以便不同的作业可以处理相同的数据。 DAG 是 Spark 速度的主要部分。
Spark 代码库要小得多。
希望这会有所帮助。