尽管没有合并/重新分区,为什么 spark 只创建一个零件文件?

问题描述 投票:0回答:1

我只有 dataset.write().format("parquet").save("path");

不,在源代码的任何地方合并/分区。

具有 4 个执行器的远程集群

案例一: 输入大小:500 MB(单个文件中有 100 万条记录)

输出大小:180 MB(1 个单部分文件)- 假设 HDFS 块大小为 180 MB(我尚未确认,但我可以安全地假设 HDFS 块大小 >= 180 MB,因为它创建了一个180 MB 大小的文件,如果我在这里错了请纠正我)

我在这里的期望是 Spark 会创建类似于 CASE 2 的多个零件文件。

案例 2: 输入大小:50 MB(5 个输入文件)

输出大小:多个不同大小的零件文件

我想了解 Spark 确定其生成的零件文件数量的行为。

apache-spark partitioning
1个回答
0
投票

如果 Spark 转储到一个文件中,则意味着数据集只有一个分区。要强制转储到多个文件中,您需要将

repartition
与更多分区一起使用

dataset.repartition(2).write().format("parquet").save("path"); 

Spark 根据以下因素决定分区数量:

  • 在本地运行:将是可用的执行程序 CPU 内核数
  • 在 HDFS 集群上运行:它为每个 HDFS 块创建一个分区(默认为 128 MB)

两种控制分区数量的配置:

  • spark.files.maxPartitionBytes
    这是读取文件时打包到单个分区的最大字节数(默认为128MB),所以如果你有一个500MB的文件那么分区数就是4个分区。
  • spark.sql.files.minPartitionNum
    这是读取文件时建议的(不保证)最小分区数。默认为
    spark.default.parallelism
    ,默认等于MAX(集群中的核心总数,2)。
© www.soinside.com 2019 - 2024. All rights reserved.