AWS Glue处理TB级CSV转Parquet时触发Spark结果大小超限错误
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的内存和核心数,比如:
每个Executor能处理更多数据,自然会减少任务总数,从而降低返回给Driver的结果总大小。--conf spark.executor.memory=16g spark.executor.cores=4
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

