【问题标题】:spark.sql.files.maxPartitionBytes not limiting max size of written partitionsspark.sql.files.maxPartitionBytes 不限制写入分区的最大大小
【发布时间】:2020-06-30 00:36:36
【问题描述】:

我正在尝试将镶木地板数据从另一个 s3 存储桶复制到我的 s3 存储桶。我想将每个分区的大小限制为最大 128 MB。我认为默认情况下 spark.sql.files.maxPartitionBytes 会设置为 128 MB,但是当我在复制后查看 s3 中的分区文件时,我看到的是大约 226 MB 的单个分区文件。我在看这篇文章,它建议我设置这个 spark 配置键以限制我的分区的最大大小:Limiting maximum size of dataframe partition 但它似乎不起作用?

这是该配置键的定义:

打包到单个分区的最大字节数 读取文件。此配置仅在使用时有效 基于文件的源,例如 Parquet、JSON 和 ORC。

我也有点困惑这与写入的镶木地板文件的大小有何关系。

作为参考,我在胶水 1.0、火花 2.4 上运行胶水脚本,脚本是这样的:

val conf: SparkConf = new SparkConf()
conf.set("spark.sql.catalogImplementation", "hive")
    .set("spark.hadoop.hive.metastore.glue.catalogid", catalogId)
val spark: SparkContext = new SparkContext(sparkConf)

val glueContext: GlueContext = new GlueContext(spark)
val sparkSession = glueContext.getSparkSession

val sqlDF = sparkSession.sql("SELECT * FROM db.table where id='item1'")
sqlDF.write.mode(SaveMode.Overwrite).parquet("s3://my-s3-location/")

【问题讨论】:

    标签: apache-spark apache-spark-sql aws-glue


    【解决方案1】:

    spark.sql.files.maxPartitionBytes 的设置确实影响了在 Spark 集群上读取数据时的最大分区大小。如果输出后的最终文件太大,那么我建议减小此设置的值,它应该创建更多文件,因为输入数据将分布在更多分区中。但是,如果您的查询中有任何 shuffle,则情况并非如此,因为这样它总是会重新分区为 spark.sql.shuffle.partitions 设置给出的分区数。

    此外,文件的最终大小将取决于您将使用的文件格式和压缩方式。因此,如果您将数据输出到例如 parquet 中,文件将比输出到 csv 或 json 小得多。

    【讨论】:

    • 等等,但是为什么 parquet 文件大小几乎是默认 maxPartitionBytes 值(128 MB)的两倍(230 MB)?当您说我的文件的最终大小将取决于我使用的文件格式和压缩时-所以我正在读/写镶木地板-但是我每列中的对象都是大型嵌套结构-这就是您所说的文件影响最终尺寸的格式? (对不起,我是新来的火花)
    【解决方案2】:

    您可以使用"spark.sql.files.maxRecordsPerFile" 来限制可以写入一个拼花文件的最大记录数,从而控制文件的最大大小

    【讨论】:

      猜你喜欢
      • 2012-04-21
      • 2019-02-02
      • 2012-12-01
      • 2013-03-06
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多