【发布时间】: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