Apache spark 如何控制拼花地板文件在胶水中的大小?

Apache spark 如何控制拼花地板文件在胶水中的大小?,apache-spark,pyspark,parquet,aws-glue,Apache Spark,Pyspark,Parquet,Aws Glue,我将数据集加载到DynamicFrame中,执行转换,然后将其写回S3: datasink = glueContext.write_dynamic_frame.from_options( frame = someDateFrame, connection_type = "s3", connection_options = { "path": "s3://the-bucket/some-data-set" }, format = "pa

我将数据集加载到DynamicFrame中,执行转换,然后将其写回S3:

datasink = glueContext.write_dynamic_frame.from_options(
    frame = someDateFrame, 
    connection_type = "s3", 
    connection_options = {
        "path": "s3://the-bucket/some-data-set"
    }, 
    format = "parquet"
)
结果是12个拼花文件,平均大小约为3MB

首先,我不明白为什么Glue/Spark默认情况下不会创建一个36MB大小的文件,因为几乎所有的消费软件(Presto/Athena,Spark)都喜欢大约100MB的文件大小,而不是一堆小文件。如果这里有人有见解的话,我很乐意听到


但实际上,我想知道是否有可能让Glue/Spark生成一个大文件或至少更大的文件。有可能吗?我还没试过。但是您可以在
write\u from\u options
中设置
acculator\u size

检查如何传递值

或者,您可以在写入之前将pyspark DF与1个分区一起使用,以确保它只写入一个文件

df.coalesce(1).write.format('parquet').save('s3://the-bucket/some-data-set')

请注意,写入1文件不会利用并行写入,因此会增加写入时间。

在将动态数据帧写入S3之前,您可以尝试重新分区(1)。请参阅了解为什么合并(1)是一个错误的合并选择。如果单个节点无法保存所有要写入的数据,也可能会导致内存不足(OOM)异常。

从长远来看,使用coalesce(1)会降低Glue的性能。虽然它可能适用于小文件,但对于较大的文件,它将花费相当长的时间

coalesce(1)仅使1个spark执行器写入文件,如果没有coalesce(),则将使用所有spark执行器写入文件

此外,使用coalesce(1)将有更大的成本。1个执行器长时间运行的成本将高于所有执行器运行1个执行器所用时间的一部分

Coalesce(1)花了4小时48分钟来处理1GB的拼花地板Snappy压缩数据

聚结(9)用了48分钟


没有Coalesce()在25分钟内完成相同的工作。

您可以正确指定spark.sql.shuffle.partitions,而不是使用默认的200。看见