【问题标题】:Apache spark - Many output filesApache spark - 许多输出文件
【发布时间】:2018-03-09 13:08:34
【问题描述】:

我正在使用 apache-spark 我的 Spark 作业每天创建 10k 个小文件(~50MB)对于 HDFS 中的命名节点来说太过分了

我尝试使用合并来减少输出文件的数量,但会减慢工作速度。 谁能建议我应该使用什么?

【问题讨论】:

  • 日志是否显示了为什么使用 coalesce() 运行速度较慢?它只是减慢了保存到磁盘的速度,还是降低了上游任务的并行度?也许您需要使用 coalesce() 参数,而不是大幅减少数量...

标签: hadoop apache-spark hdfs partitioning


【解决方案1】:

我们有一个类似的案例。我们每小时运行一个批处理作业并合并所有新文件。您可以使用另一个 spark 作业或任何其他最适合您的框架来执行此操作。通过这种方式,您可以完全解耦这两个任务,并从每个任务中获得最佳性能。

【讨论】:

  • 这被称为关注点分离,这是要走的路。好方法!
【解决方案2】:

我想出了一个解决方案!

调用coalesce,#partitions 等于#executors

通过执行此操作,执行器上的任何一项任务都将仅声明其执行器任务输出文件。

如果这看起来不错,请告诉我!

【讨论】:

  • Spark 产生与分区数一样多的输出文件。获得单个输出文件的一种方法是在写入磁盘之前调用 repartition(1)。不确定 coalesce() 方法:即使您将#partitions 设置为等于#executors,您也不能保证一个执行程序恰好有一个分区
  • @Marco coalesce(1) 和 repartition(1) 是非常糟糕的做法。
  • @eliasah 我同意你的看法......这就是为什么我建议使用 coalesce(#noOfExecutors)......你怎么看
【解决方案3】:

你试过repartition(#executors) 吗?有可能比coalesce(#executors)更好。

根据 Scaladoc 的 coalesce 方法,

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

另请参考:Spark: coalesce very slow even the output data is very small

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多