为什么 Spark 在字数统计时速度很快?
Why is Spark fast when word count?
测试用例:Spark在20+秒内对6G数据进行字数统计。
我了解 MapReduce、FP 和 stream 编程模型,但无法理解字数统计的速度是如此之快。
我认为在这种情况下是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 简化了复杂的操作,如join 和groupBy 而在后端,您正在处理零散的数据。这种碎片使 Spark 能够并行执行。
Spark 允许使用有向无环图 (DAG) 模式开发复杂的多步数据管道。它支持跨 DAG 共享内存数据,因此不同的作业可以使用相同的数据。 DAGs 是 Sparks 速度的主要部分。
希望对您有所帮助。
测试用例:Spark在20+秒内对6G数据进行字数统计。
我了解 MapReduce、FP 和 stream 编程模型,但无法理解字数统计的速度是如此之快。
我认为在这种情况下是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 简化了复杂的操作,如join 和groupBy 而在后端,您正在处理零散的数据。这种碎片使 Spark 能够并行执行。
Spark 允许使用有向无环图 (DAG) 模式开发复杂的多步数据管道。它支持跨 DAG 共享内存数据,因此不同的作业可以使用相同的数据。 DAGs 是 Sparks 速度的主要部分。
希望对您有所帮助。