【问题标题】:Why is Spark fast when word count? [duplicate]为什么字数统计时 Spark 速度快? [复制]
【发布时间】:2015-05-05 05:37:43
【问题描述】:

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

我了解 MapReduceFPstream 编程模型,但无法弄清楚字数统计速度如此惊人。

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

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

【问题讨论】:

  • 你用了多少台电脑?

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


【解决方案1】:

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

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

最后,Hadoop 多次将中间数据放入磁盘。它至少将map 输出放入磁盘一次(如果映射输出很大并且发生磁盘合并,则更多)。在reduce 本身执行之前,它会在下次reduce 端将数据放入磁盘。 Spark 在shuffle 阶段仅将数据放入 HDD 一次,参考 Spark 实现建议增加文件系统写入缓存,以免这种“洗牌”数据撞击磁盘

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

【讨论】:

  • 你的意思是有47个线程来处理文件吗?如果是这样的话,电脑有8核CPU,不可能8核CPU同时运行47个线程吧?
  • 你的意思是计算是在一台机器上完成的? 8 核 Xeon 处理 16 个并行线程,如果您有足够的 RAM,所有文件都将被缓存并从内存中读取(即使使用磁盘,良好的 raid 也可以为顺序 IO 提供相当的性能)。
【解决方案2】:

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

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

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

【讨论】:

  • AFAIK 参考 Hadoop WordCount 实现默认带有组合器:hadoop.apache.org/docs/current/hadoop-mapreduce-client/…
  • 但他没有提到他使用这个 Wordcount 实现来与 Spark 性能进行比较。
  • 这是典型的基准测试:显示工具 A 优于工具 B 人们通常会显示工具 A 的最佳情况与工具 B 的最差情况。需要明确的是,没有组合器,没有人会在生产中使用 wordcount
  • 你做了多个假设。他没有提到他将 Wordcount 用于生产程序或类似的东西。 Spark 中的组合器概念是一项重要功能,Spark 新手可能会注意到这一点。
【解决方案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 简化了复杂的操作,例如 joingroupBy,在后端,您处理的是碎片数据.正是这种碎片化使得 Spark 能够并行执行。

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多