Apache spark 如何控制拼花地板文件在胶水中的大小?
我将数据集加载到DynamicFrame中,执行转换,然后将其写回S3: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
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。看见