AWS Glue批量执行Spark规则任务时Executor异常问题求助
问题
在AWS Glue中运行Spark任务,流程如下:
- 客户端定义数百条规则,选择规则并提供输入数据
- 任务加载数据后逐条执行规则,规则以Python文件形式定义,执行代码如下:
for rule in rules: result = importlib.import_module(module).handle(glue_context, dataframe, global_params, rule_params)
小批量(10-15条)规则执行正常,但大批量(25-50条)时出现错误。数据集规模:7万行、200列;Glue配置:最大15个DPU,G.1X工作节点类型。
出现的错误包括:
- Driver日志提示Executor Lost Failure (executor ID: 1),关联容器超限或网络问题
- Executor端报
java.lang.StackOverflowError org.apache.spark.shuffle.FetchFailedException,提示关联远程Executor已宕机
已尝试配置--conf: 'spark.task.cpus=2',可执行更多规则但仍会失败。
排查与优化建议
1. 调整JVM栈与Executor内存配置
针对StackOverflowError,优先解决栈内存不足问题:
- 添加Glue配置参数,增大JVM线程栈大小:
默认栈大小通常为1m,规则代码若有深层调用或递归,容易触发栈溢出,调高到4m可缓解该问题。--conf spark.executor.extraJavaOptions="-Xss4m" - 调整Executor堆内存,G.1X节点每个DPU对应1个Executor,默认内存可能不足以支撑多规则连续执行:
(G.1X每个Executor默认4g内存,可根据规则复杂度适当调整)--conf spark.executor.memory=8g --conf spark.executor.memoryOverhead=2g
2. 优化Shuffle相关配置
针对FetchFailedException,解决Executor间 shuffle 数据传输故障:
- 调整shuffle分区数,避免单分区数据量过大导致传输超时:
可根据数据量在100-400区间内微调。--conf spark.sql.shuffle.partitions=200 - 增加shuffle重试次数与超时时间:
降低因网络波动导致的shuffle失败概率。--conf spark.shuffle.fetch.retryInterval=5s --conf spark.shuffle.io.maxRetries=10 --conf spark.locality.wait=3s
3. 调整任务资源分配与并行策略
- 取消
spark.task.cpus=2的强制配置,改为spark.task.cpus=1:G.1X节点有4vCPU,单任务占1核可让节点同时运行更多任务,提升并行效率,避免单个任务占用过多资源导致容器被kill。 - 分批次执行规则,每执行完一批(比如20条)主动清理Spark缓存:
避免中间DataFrame累积占用过多内存。from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() # 每批规则执行完毕后清理缓存 spark.catalog.clearCache()
4. 检查规则代码逻辑
- 排查每条规则的
handle方法是否存在递归调用、内存泄漏(比如未释放的全局变量、大量冗余DataFrame) - 检查是否有规则频繁触发宽依赖操作(如join、groupBy),这类操作会引发大量shuffle,极易导致Executor负载过高。
5. 调整Glue集群配置
- 将最大DPU从15调高到20-25,开启Glue自动缩放,避免资源耗尽导致Executor被强制销毁。
- 检查VPC安全组与网络配置,确保Driver与Executor之间网络连通性良好,无带宽瓶颈或端口限制。
内容的提问来源于stack exchange,提问作者Pawel
相关产品推荐
相关产品推荐

