【问题标题】:Need less parquet files需要更少的镶木地板文件
【发布时间】:2017-01-08 07:28:57
【问题描述】:

我正在做以下过程

rdd.toDF.write.mode(SaveMode.Append).partitionBy("Some Column").parquet(output_path)

但是,在每个分区下,parquet 文件太多,而且每个文件的大小都非常小,这会使我接下来的步骤加载所有 parquet 文件变得很慢。有没有更好的办法,在每个分区下,减少parquet文件,增加单个parquet文件的大小?

【问题讨论】:

标签: apache-spark dataframe rdd partition bigdata


【解决方案1】:

你可以在保存前重新分区:

rdd.toDF.repartition("Some Column").write.mode(SaveMode.Append).partitionBy("Some Column")

【讨论】:

  • 我相信这会奏效。但是, repartition() 会导致大量网络流量。我想知道是否还有其他有效的方法?
【解决方案2】:

我曾经遇到过这个问题。

实际上你无法控制文件的分区,因为它取决于执行者在做什么。

解决它的方法是使用方法coalesce 进行随机播放,您可以创建所需的分区数量,但这不是有效的方法,您还需要设置足够的驱动程序内存来​​处理此操作。

df = df.coalesce(numPartitions).write.partitionBy(""yyyyy").parquet("xxxx")

【讨论】:

  • 感谢您的建议。如果我用另一个 partitionBy(new HashPartitioner(numPartitions)) 替换“coalesce”,尝试是否可以更有效。
【解决方案3】:

我也遇到过这个问题。问题是如果您使用合并,每个分区都会获得相同数量的镶木地板文件。现在不同的分区有不同的大小,所以理想情况下我需要为每个分区使用不同的合并。

【讨论】:

    【解决方案4】:

    如果您打开很多小文件,这将非常昂贵。假设您打开 1k 个文件,每个文件大小都与 parquet.block.size 的值相差甚远。

    以下是我的建议:

    • 创建一个作业,该作业将首先合并您的输入 parquet 文件,以减少其大小接近或等于 parquet.block.size 的文件数量。默认块大小为 128Mb,但可通过更新 parquet.block.size 进行配置。如果您的 parquet 文件接近或等于 parquet.block.size 的值,Spark 会很高兴。块大小是在内存中缓冲的行组的大小。
    • 或更新您的 Spark 作业以仅读取有限数量的文件
    • 或者,如果您拥有大型机器和/或资源,只需进行正确的调整即可。

    【讨论】:

      【解决方案5】:

      Hive 查询有一种将小文件合并成大文件的方法。这在 spark sql 中不可用。此外,减少 spark.sql.shuffle.partitions 对 Dataframe API 没有帮助。 我尝试了以下解决方案,它生成的镶木地板文件数量较少(从 800 个镶木地板文件到 29 个)。

      假设数据被加载到数据框df

      1. 在 hive 中创建一个临时表。

        df.createOrReplaceTempView("tempTable")
        spark.sql("CREATE TABLE test_temp LIKE test")
        spark.sql("INSERT INTO TABLE test_temp SELECT * FROM tempTable")
        

        test_temp 将包含小的 parquet 文件。

      2. 从临时表填充最终配置单元表

        spark.sql("INSERT INTO test SELECT * FROM test_temp")
        

      决赛桌将包含较少的文件。填充最终表后删除临时表。

      【讨论】:

        猜你喜欢
        • 2019-06-02
        • 1970-01-01
        • 2019-09-23
        • 2018-07-01
        • 1970-01-01
        • 2015-06-29
        • 2019-11-20
        • 2017-08-12
        • 2016-01-18
        相关资源
        最近更新 更多