【问题标题】:Spark write to HDFS is slowSpark写入HDFS很慢
【发布时间】:2020-09-15 12:59:49
【问题描述】:

我在 HDFS(非分区)上有大约 80 亿行,250GB 大小的 ORC 数据。 我正在读取 DF 中的数据,使用 partitionBy 编写没有任何转换的 DF 前任: df.write.mode("overwrite").partitionBy("some_column").orc("hdfs path")

当我在 spark UI 中监控作业状态时 - 作业和阶段将在 20 分钟内完成。但 spark UI 中的“SQL”选项卡显示 40 分钟。

在调试模式下运行作业并查看 spark log 后,我意识到写入“_temporary”的任务将在 20 分钟内完成。

之后,“_temporary”合并到实际输出路径需要20分钟。

所以我的问题是,驱动程序进程是否将数据从“_temporary”顺序合并到输出路径?还是由executor任务完成的?

我可以做些什么来提高性能?

【问题讨论】:

  • 尝试使用重新分区来实现更多并行执行
  • 我一直想知道量化有多慢?需要构建ORC格式,写入比存放一个普通的旧文本文件要高。重新分区,但是你现在的并发是多少?
  • 我运行了 20 个 8 核的执行器,所以大约 160 个任务。我的缓慢问题更多是关于将“_temporary”合并到最终输出路径。
  • 如果你使用 repartition .. 大部分合并文件将被跳过,因为每个执行器将在分区目录中写入一个文件。说如果你使用repartition(10),10个文件将被写入分区目录。

标签: apache-spark hadoop hdfs


【解决方案1】:

您可能需要检查应用配置中的spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 选项。对于版本 1,驱动程序确实提交 temp。文件顺序,众所周知,这会造成瓶颈。但坦率地说,人们通常只在比你的情况更多的文件上观察到这个问题。根据 Spark 的版本,您可能可以将提交版本设置为 2,有关详细信息,请参阅SPARK-20107

另外,不建议每个执行器使用 8 个内核,因为当所有 8 个任务同时写入输出时,它可能会使磁盘 IO 饱和。

【讨论】:

    猜你喜欢
    • 2017-03-17
    • 2018-06-02
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2017-08-22
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多