You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Glue Job将JSON转Parquet出现内存不足错误,求助解决方案

解决方案

1. 改用Spark分布式处理替代单进程Pandas

当前脚本用awswrangler+pandas将1-1.5GB的JSON文件全量加载到单进程内存,直接导致内存耗尽。Glue基于Spark,必须用分布式API处理:

替换原try块内的读写逻辑为Spark实现(需先在main开头初始化GlueContext):

# 在main函数开头补充初始化
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
from pyspark.sql.functions import col, lit

# 替换原try块内的代码
df = glueContext.read.json(s3_json_location, multiLine=False)  # 对应lines=True的JSON格式
# 将所有字段转换为字符串
df = df.select([col(c).cast("string") for c in df.columns])
# 添加分区字段
df = df.withColumn("flowstartdate", lit(date_file_created))
# 写入Parquet,自动按分区存储
df.write.partitionBy("flowstartdate").mode("append").parquet(destination_par_folder_with_bucket)

2. 优化Worker配置与Spark内存参数

  • 升级Worker类型:将G.2X(8vCPU/16GB内存)替换为G.4X(16vCPU/32GB内存),单Worker可承载更大的数据集分片。
  • 调整Spark参数:在Glue Job的「Job Parameters」中添加以下配置:
    • --conf spark.driver.memory=8g
    • --conf spark.executor.memory=12g
    • --conf spark.executor.cores=4
      让每个Executor分配更多内存,降低内存溢出概率。

3. 优化文件处理逻辑

  • 批量读取而非串行循环:原脚本用boto3遍历文件逐个处理,改成直接让Spark读取整个S3前缀下的文件,分布式处理:
    # 替换整个main函数的文件遍历逻辑
    input_path = destination_json_folder_with_bucket + "*"
    df = glueContext.read.json(input_path, multiLine=False)
    # 将get_date_from_file转为UDF,从文件名提取日期
    from pyspark.sql.functions import udf, input_file_name
    from pyspark.sql.types import StringType
    get_date_udf = udf(get_date_from_file, StringType())
    df = df.withColumn("flowstartdate", get_date_udf(input_file_name()))
    # 后续转换和写入逻辑同上
    
  • 调整文件分片大小:设置--conf spark.sql.files.maxPartitionBytes=256m,让每个Spark Task处理256MB的数据,匹配Worker内存能力。

4. 修复内存泄漏与错误处理

  • 添加内存清理:如果保留串行处理逻辑,在循环末尾添加内存释放代码:
    import gc
    # 循环末尾执行
    del dfs
    gc.collect()
    
  • 修复错误处理中的未定义变量:将source_bucket_name改为curated_bucket,destination_bucket改为存储错误文件的对应桶(如专门的错误桶)。

内容的提问来源于stack exchange,提问作者nahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:59:56