当字数统计时,为什么Spark会快速?

时间:2015-03-04 09:35:32

标签: parallel-processing streaming apache-spark bigdata rdd

测试用例:Spark在20+秒内对6G数据进行字数统计。

我理解 MapReduce FP stream 编程模型,但无法弄清楚单词计数是如此惊人的快速。

我认为在这种情况下它是一个I / O密集型计算,并且不可能在20多秒内扫描6G文件。我想在字数统计之前会有索引,就像Lucene一样。神奇应该是 RDD (弹性分布式数据集)设计,我不太了解。

我很感激有人可以解释 RDD 这个词计数案例。谢谢!

3 个答案:

答案 0 :(得分:4)

首先是启动时间。 Hadoop MapReduce作业启动需要启动一些不快的JVM。 Spark作业启动(在现有Spark集群上)导致现有JVM分叉新任务线程,这比启动JVM快一些

接下来,没有索引也没有魔法。 6GB文件存储在47个块中,每块128MB。想象一下,你有一个足够大的Hadoop集群,所有这47个HDFS模块都驻留在不同的JBOD硬盘上。它们中的每一个都可以为您提供70 MB /秒的扫描速率,这意味着您可以在约2秒内读取此数据。使用群集中的10GbE网络,您可以在7秒内将所有这些数据从一台计算机传输到另一台计算机。

最后,Hadoop多次将中间数据放入磁盘。它将map输出至少放入磁盘一次(如果映射输出很大并且磁盘上合并发生,则更多)。在reduce本身执行之前,它会在reduce侧将数据放入磁盘。 Spark在shuffle阶段仅将数据放入HDD一次,参考Spark实施建议增加文件系统写入缓存,不要让这个“随机”数据到达磁盘

与Hadoop相比,所有这些都为Spark带来了巨大的性能提升。与此问题相关的Spark RDD没有任何魔力

答案 1 :(得分:0)

除0x0FFF提到的因素外,结果的局部组合也使得火花运行字数更有效。默认情况下,Spark会在将结果发送到其他节点之前组合每个节点上的结果。

在单词计数作业的情况下,Spark计算节点上每个单词的计数,然后将结果发送到其他节点。这减少了通过网络传输的数据量。要在Hadoop Map-reduce中实现相同的功能,您需要指定组合器类job.setCombinerClass(CustomCombiner.class)

通过在Spark中使用combineByKey(),您可以指定自定义组合器。

答案 2 :(得分:0)

  • Apache Spark 处理内存中的数据,而Hadoop MapReduce 会在map或reduce操作后保留回磁盘。但Spark需要大量内存

  • Spark 将一个进程加载到内存中,并将其保留在那里,直到进一步通知为止,以便进行缓存。

  • 弹性分布式数据集(RDD),它允许您透明地将数据存储在内存中,并在需要时将其保存到光盘中。

  • 由于 Spark 使用内存,因此没有同步障碍会降低您的速度。这是Spark表现的主要原因。

  • Spark不仅可以像处理MapReduce一样处理一批存储数据,还可以使用 Spark Streaming 实时处理数据。

  • DataFrames API的灵感来自R和Python(Pandas)中的数据框架,但是从头开始设计为现有 RDD API的扩展

  • DataFrame 是按指定列组织的分布式数据集合,但支持火花速度的更丰富的优化

  • 使用 RDD 的Spark可以简化复杂的操作,例如加入 groupBy ,在后端,您可以处理碎片数据。这种碎片使 Spark 能够并行执行。

  • Spark 允许使用有向非循环图( DAG )模式开发复杂的多步数据管道。它支持跨DAG的内存数据共享,因此不同的作业可以使用相同的数据。 DAG Spark 速度的主要部分。

希望这有帮助。