使用少于 N 个分区的 N 个文件向磁盘写入火花

Posted

技术标签:

【中文标题】使用少于 N 个分区的 N 个文件向磁盘写入火花【英文标题】:spark write to disk with N files less than N partitions 【发布时间】:2018-06-17 00:15:19 【问题描述】:

我们可以将数据写入 100 个文件,每个文件有 10 个分区吗?

我知道我们可以使用重新分区或合并来减少分区的数量。但是我已经看到一些 hadoop 生成的 avro 数据,其分区比文件数多。

【问题讨论】:

【参考方案1】:

写入的文件数量由 DataFrame 或 RDD 的并行化控制。因此,如果您的数据被拆分为 10 个 Spark 分区,则您不能在不减少分区的情况下写入少于 10 个文件(例如 coalescerepartition)。

现在,话虽如此,当数据被读回时,可以根据您配置的拆分大小(但取决于格式和/或压缩)将其拆分为更小的块。

如果您想增加每个 Spark 分区写入的文件数量(例如,为了防止文件太大),Spark 2.2 在您写出数据时引入了maxRecordsPerFile 选项。有了这个,您可以限制每个分区中每个文件写入的记录数。另一个选择当然是重新分区。

以下将导致 2 个文件被写出,即使它只有 1 个分区:

val df = spark.range(100).coalesce(1)
df.write.option("maxRecordsPerFile", 50).save("/tmp/foo")

【讨论】:

感谢您的回复。它似乎是多个文件中的一个分区。我正在寻找的是相反的方式。用例是一个文件夹中的多个文件有时会导致 hadoop 搜索这些文件的一些开销,有时会导致内存问题。 是的,抱歉误会了,所以更新了我的回复以澄清 我正在处理的 hadoop 生成的数据有 1000 个文件,但有 80000 个分区。不知道 spark 拥有和 hadoop 一样的能力有多难 您使用什么文件格式以及如何写出数据?你在使用 hive、mapreduce 等吗?只是为了确保我们说的是同一件事,当您说分区时,您是在说输入拆分还是蜂巢式分区文件夹?另外,你看到的80000个分区,是你读回数据时的那些分区吗?这由 HDFS 块大小决定。因此,只要您以相同的格式、相同的压缩方式编写,那么这仍然适用于 Spark。 是的,Avro 是可拆分的。因此,当 Spark 读取它时,它会根据块大小将单个文件拆分为多个分区。您可以在代码本身中看到isSplittable 方法是true:github.com/databricks/spark-avro/blob/branch-4.0/src/main/scala/…

以上是关于使用少于 N 个分区的 N 个文件向磁盘写入火花的主要内容,如果未能解决你的问题,请参考以下文章

linux系统分区

Linux磁盘管理和文件系统管理

linux lvm扩容磁盘大小

磁盘分区

Linux磁盘分区

三:磁盘与文件系统篇——磁盘分区格式化检验挂载