【问题标题】:How to process data in parallel but write results in a single file in Spark如何并行处理数据但将结果写入 Spark 中的单个文件
【发布时间】:2018-10-31 13:03:29
【问题描述】:

我有一份 Spark 工作:

  • 从 hdfs 读取数据
  • 进行一些密集的转换没有洗牌和聚合(仅映射操作)
  • 将结果写回 hdfs

假设我有 10GB 的原始数据(40 个块 = 40 个输入分区),这会产生 100MB 的处理数据。为了避免在 hdfs 中生成许多小文件,我使用“coalesce(1)”语句来编写带有结果的单个文件。 这样做我只运行了 1 个任务(因为“coalesce(1)”并且没有洗牌),它在一个线程中处理所有 10GB。

有没有办法在 40 个并行任务中进行实际的密集处理,并在写入磁盘之前减少分区数量并避免数据混洗?

我有一个可能可行的想法 - 在所有处理后将数据帧缓存在内存中(进行计数以强制 Spark 缓存数据),然后放入“coalesce(1)”并将数据帧写入磁盘

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    文档清楚地警告了这种行为并提供了解决方案:

    但是,如果您要进行剧烈的合并,例如对于 numPartitions = 1,这可能会导致您在比您喜欢的更少的节点上进行计算(例如,在 numPartitions = 1 的情况下为一个节点)。为避免这种情况,您可以调用 repartition。这将添加一个 shuffle 步骤,但意味着当前的上游分区将并行执行(无论当前分区是什么)。

    所以改为

    coalesce(1)
    

    你可以试试

    repartition(1)
    

    【讨论】:

    • 谢谢!确实有道理:)
    猜你喜欢
    • 2021-01-19
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    相关资源
    最近更新 更多