gpt4 book ai didi

hadoop - 用于文件写入的 Spark 分区非常慢

转载 作者:可可西里 更新时间:2023-11-01 14:36:51 24 4
gpt4 key购买 nike

当使用 Spark 将文件写入 HDFS 时,这在不使用分区时相当快。相反,当我使用分区写入文件时,写入延迟增加了 ~24 倍。

同一个文件,不分区写入大约需要600ms。按 Id 分区写入(将生成恰好 1.000 个分区,因为文件中有 1.000 个 id)大约需要 14 秒。

你们有没有同样的经历,写一个分区文件需要很长时间?根本原因是什么,也许 Spark 需要为每个分区创建 1.000 个文件夹和文件?您知道如何加快这一步吗?

val myRdd = streamedRdd.map { case ((id, metric, time), value) => Record(id, metric, getEpoch(time), time, value) }

val df = myRdd.toDF

df.write.mode(SaveMode.Append)
.partitionBy("id")
.parquet(path)

最佳答案

Spark 执行器与 HDFS 通信以写入它们拥有的数据,这取决于分区后数据在集群中的分布情况。

显然,与顺序写入整个文件相比,对于较小的数据 block ,建立从多个执行器节点到 HDFS 的连接并写入的时间会更长。

如何避免这种情况:

默认情况下,spark 使用哈希分区器对数据进行分区(对键进行哈希处理,具有相同哈希值的键转到同一节点)尝试指定范围分区器,请在下面找到示例片段:

以下代码片段使用哈希分区器 yourRdd.groupByKey().saveAsTextFile("HDFS 路径");

以下代码片段使用了我们的自定义范围分区器它创建了 8 个分区,如 RangePartitioner(8, yourRdd) 中所述,通过 8 个连接写入比通过 1000 个连接写入更好。

val tunedPartitioner = new RangePartitioner(8, yourRdd)
val partitioned = yourRdd.partitionBy(tunedPartitioner).saveAsTextFile("HDFS PATH");

同样,这是要写入的数据与您创建的分区数量之间的权衡。

关于hadoop - 用于文件写入的 Spark 分区非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36353190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com