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

AWS Glue处理TB级CSV转Parquet时触发Spark结果大小超限错误

解决AWS Glue ETL处理大文件时spark.driver.maxResultSize超限问题

我来帮你分析并解决这个问题——你遇到的情况很典型:小数据量下Glue运行正常,但数据累积到0.5-1TB时,作业跑10小时后触发了Driver结果大小超限的错误,而且你尝试在代码里设置spark.driver.maxResultSize=3g没生效。

先看错误日志里的核心原因:

Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Total size of serialized results of 3228 tasks (1024.0 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)

这个错误说明任务执行后返回给Driver的结果数据总大小超过了默认的1GB限制,但你代码里的配置没生效,问题出在AWS Glue的配置优先级上——直接在代码里修改SparkConf,会被Glue作业初始化时的默认配置覆盖,所以根本没起作用。

下面是具体的解决步骤,按优先级排序:

1. 用Glue作业参数正确设置Spark配置

这是最关键的一步,必须通过Glue控制台的作业参数来传递Spark配置,而不是在代码里设置:

  • 打开你的Glue ETL作业,进入「编辑」页面
  • 找到「作业参数」区域,添加新的键值对:
    • 键:--conf
    • 值:spark.driver.maxResultSize=3g
      如果需要同时设置多个参数,用空格分隔即可,比如:spark.driver.maxResultSize=3g spark.executor.memory=16g

为什么代码里设置没用?因为Glue会在作业启动时先初始化自己的Spark上下文,你的代码里的conf.set()是在上下文创建之后执行的,根本覆盖不了Glue的默认配置。

2. 优化任务分区,减少返回Driver的结果总量

错误里提到有3228个任务,总和超过1GB,说明任务数量太多,或者单个任务返回的数据太大。可以这么优化:

  • 合并输入分区:如果S3上有大量小CSV文件,Glue会生成大量任务。读取数据后用repartition()或者coalesce()合并分区,比如:
    # 读取CSV后合并分区,减少任务数(数字根据你的集群资源调整)
    raw_df = spark.read.csv(input_s3_path, header=True, inferSchema=True)
    optimized_df = raw_df.repartition(1000)
    
  • 避免在Driver端拉取大量数据:检查代码里有没有collect()、take()、count()这类会把数据拉到Driver的操作。如果必须统计,用approxCountDistinct()代替countDistinct(),或者把计算逻辑放到Executor端执行。

3. 升级Glue作业的资源配置

处理0.5-1TB的数据,默认的Glue资源肯定不够:

  • 增加DPU数量:在作业配置里提高DPU的数量,更多的DPU意味着更多的Executor资源,能更高效地处理分区任务,减少单个任务的负载。
  • 调整Executor资源:通过--conf参数设置Executor的内存和核心数,比如:
    --conf spark.executor.memory=16g spark.executor.cores=4
    
    每个Executor能处理更多数据,自然会减少任务总数,从而降低返回给Driver的结果总大小。

4. 优化分区写入逻辑

你用partitionBy(['part_date'])写入Parquet,如果part_date的基数很大(比如每天有几百个不同的日期值),会生成大量分区目录和小文件,进而导致任务数量暴增。可以:

  • 调整分区粒度:比如按周或者月分区,减少分区的数量
  • 启用动态分区优化:添加参数spark.sql.sources.partitionOverwriteMode=dynamic,避免全量扫描现有分区,提高写入效率

5. 排查代码中的潜在问题

仔细检查你的ETL代码,有没有以下情况:

  • 写入前做了大量的聚合、排序操作,导致中间结果过大?
  • 用broadcast()广播了过大的数据集?广播大文件会占用Driver和Executor的内存,间接导致结果数据超限。

先从第一步开始调整,把spark.driver.maxResultSize通过作业参数设置为3G或更大,同时调整DPU和分区数,应该就能解决这个问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:37:16