AWS Glue写入S3的Parquet文件数与MySQL记录数一致问题排查
问题分析与解决:Glue任务生成与记录数相同的Parquet文件
原因
这种现象本质是Spark(AWS Glue基于Spark构建)的分区机制导致的:
- 当读取的数据集极小(仅13条记录)时,Spark的分区数可能等于记录数,每个分区仅包含1条数据
- 写入Parquet时,每个分区会单独生成一个文件,最终就出现了13个文件对应13条记录的情况
- 另外,Glue通过Data Catalog读取MySQL时,若未指定JDBC分区参数,默认的分片逻辑可能会将小数据集拆分为多个小分区
解决方法
方法1:合并分区(最直接有效)
在写入前将数据合并到单个分区,这样最终只会生成一个Parquet文件。推荐用coalesce(1)(无需shuffle,性能更优),修改代码如下:
# 新增:合并分区到1个 merged_frame = ChangeSchemaApplyMapping_node1671554868239.toDF().coalesce(1) dynamic_merged_frame = glueContext.create_dynamic_frame.from_df(merged_frame, glueContext, "merged_frame") # 修改写入步骤的frame参数为合并后的DynamicFrame AmazonS3_node1671554880876 = glueContext.write_dynamic_frame.from_options( frame=dynamic_merged_frame, connection_type="s3", format="glueparquet", connection_options={ "path": "s3://onebox-glue-etl-pre/etl-tpv/output/with_partition/", "partitionKeys": [], }, format_options={"compression": "gzip"}, transformation_ctx="AmazonS3_node1671554880876", )
方法2:调整Glue作业并行度
在Glue作业的运行参数中设置:
--num-workers 1:使用1个工作节点--worker-type G.1X:限制单节点的并行度
不过这种方法对极小数据集的效果不如直接合并分区明显
方法3:优化JDBC读取分区设置
如果通过Data Catalog读取MySQL,可以在表的JDBC连接参数中指定:
numPartitions=1
这样读取MySQL数据时会用单个分区,后续写入自然也会生成单个文件
内容的提问来源于stack exchange,提问作者pm1359
相关产品推荐
相关产品推荐

