为什么 Spark 在字数统计时速度很快?

Why is Spark fast when word count?

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

我了解 MapReduceFPstream 编程模型,但无法理解字数统计的速度是如此之快。

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

如果有人能解释 RDD 的字数统计情况,我将不胜感激。谢谢!

首先是启动时间。 Hadoop MapReduce 作业启动需要启动多个独立的 JVM,速度不快。 Spark 作业启动(在现有的 Spark 集群上)导致现有的 JVM 派生新的任务线程,这比启动 JVM 快几倍

接下来,没有索引也没有魔法。 6GB 文件存储在 47 个块中,每个块大小为 128MB。假设您有一个足够大的 Hadoop 集群,所有这 47 个 HDFS 块都驻留在不同的 JBOD HDD 上。他们每个人都会为您提供 70 MB/sec 扫描率,这意味着您可以在大约 2 秒内读取此数据。通过集群中的 10GbE 网络,您可以在 7 秒内将所有这些数据从一台机器传输到另一台机器。

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

与 Hadoop 相比,所有这些都使 Spark 有了很大的性能提升。与这个问题相关的 Spark RDDs 没有魔法

除了 0x0FFF 提到的因素外,结果的本地组合也使 spark 运行 字数统计更有效。默认情况下,Spark 在将结果发送到其他节点之前组合每个节点上的结果。

对于字数统计作业,Spark 计算节点上每个字的计数,然后将结果发送到其他节点。这减少了通过网络传输的数据量。要在Hadoop Map-reduce中实现同样的功能,需要指定combiner class job.setCombinerClass(CustomCombiner.class)

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

  • Apache Spark 在内存中处理数据,而 Hadoop MapReduce 在 map 或 reduce 之后持久保存回磁盘行动。但是Spark需要大量内存

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

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

  • 由于 Spark 使用内存,因此没有同步障碍会减慢您的速度。这是Spark性能的一个重要原因。

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

  • DataFrames API 的灵​​感来自于 R 和 Python (Pandas) 中的数据帧,但设计从头开始到作为现有 RDD API.

  • 的扩展
  • A DataFrame 是组织成命名列的分布式数据集合,但在幕后有 更丰富的优化 支持spark的速度。

  • 使用RDDs Spark 简化了复杂的操作,如joingroupBy 而在后端,您正在处理零散的数据。这种碎片使 Spark 能够并行执行。

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

希望对您有所帮助。