AWS Glue使用write_dynamic_frame写avro到S3生成多part文件如何解决
问题原因
AWS Glue底层基于Spark引擎实现分布式计算,你的DataFrame默认被拆分为多个分区分布在不同的计算节点上,写出时每个分区会对应生成一个独立的part分片文件,你现在看到的9个文件就对应DataFrame当前的9个分区。
调整方案
方案1:输出单个合并文件(适合小数据量场景)
如果你的预期是输出1个完整的Avro文件,只需要在将DataFrame转为DynamicFrame之前,先将DataFrame的分区数合并为1即可,推荐使用coalesce方法(减少分区时不会产生shuffle,性能更高)。
修改后的代码如下:
def write_to_s3(data_frame, s3_path, file_name, glue_context): connection_options = {'path': f's3://{s3_path}'} # 新增:将DataFrame分区数合并为1 single_part_df = data_frame.coalesce(1) glue_context.write_dynamic_frame.from_options( frame=DynamicFrame.fromDF(single_part_df, glue_context, file_name), connection_type='s3', connection_options=connection_options, format='avro' )
⚠️ 注意:
- 如果你的数据量很大(超过单节点内存/磁盘承载能力),不建议强行合并为单个文件,会导致任务运行变慢甚至内存溢出报错,分布式多文件存储才是大数据场景下的最佳实践。
- 如果你后续需要将分区数调整到比现有分区数更多的场景,可以用
repartition(N)方法,该方法会触发shuffle操作。
方案2:自定义输出文件名
如果你的预期是修改默认的part文件名称为指定的文件名,Glue原生写出接口不支持直接指定输出文件名(分布式场景下多节点同时写会有文件名冲突问题),可以在写出完成后调用boto3的S3接口,将生成的part文件重命名为你传入的file_name参数值,同时清理生成的_SUCCESS等临时文件即可。
内容的提问来源于stack exchange,提问作者Pritam Bohra
相关产品推荐
相关产品推荐

