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

将Glue自定义PySpark作业迁移至SageMaker Processing的Spark配置匹配问题

Glue PySpark作业迁移至SageMaker Processing的配置一致性排查与最佳实践

问题根源分析

你遇到的OOM问题并非系统内存耗尽,而是Spark JVM内存分配与系统内存统计维度不一致导致的:CloudWatch显示的是实例整体内存使用率,但Spark的OOM通常是JVM堆内存(Heap)或堆外内存(Off-Heap)不足,这部分内存使用不会直接体现在系统级内存指标里。

如何获取Glue的实际Spark配置

Glue控制台不直接暴露spark-submit参数,但可以通过以下两种方式拿到完整配置:

  • 在作业代码中输出配置:在你的Glue PySpark作业中添加代码,打印所有Spark配置项:
    # 打印所有Spark配置
    for key, value in spark.sparkContext.getConf().getAll():
        print(f"{key} = {value}")
    
    运行作业后,在CloudWatch日志里就能找到spark.executor.memory、spark.executor.cores、spark.executor.memoryOverhead等关键参数。
  • 通过AWS CLI/API查询:执行以下CLI命令获取作业的默认参数和Glue版本信息(Glue版本对应固定的Spark版本,这是配置对齐的核心前提):
    aws glue get-job --job-name <你的Glue作业名称>
    
    输出的DefaultArguments字段会包含Glue特有的配置,GlueVersion字段对应Spark版本(例如Glue 4.0对应Spark 3.3,Glue 3.0对应Spark 3.1)。

对齐SageMaker Processing与Glue配置的最佳实践

1. 严格匹配Spark版本

不同Spark版本的默认内存配置差异极大,必须确保SageMaker Processing使用的Spark镜像版本与Glue完全一致。例如Glue 4.0对应Spark 3.3,初始化SparkProcessor时指定:

from sagemaker.spark.processing import SparkProcessor

spark_processor = SparkProcessor(
    framework_version="3.3",  # 与Glue版本对应的Spark版本一致
    instance_count=10,
    instance_type="ml.m5.xlarge",
    role="<你的SageMaker角色ARN>",
    base_job_name="glue-migrate-spark"
)

2. 显式同步Spark核心内存参数

根据从Glue获取的配置,在submit_app_arguments中传递对应的spark-submit参数,重点关注以下几项:

  • spark.executor.memory:Executor的JVM堆内存,Glue会根据实例类型自动分配(例如G.1X实例通常设为12g,留4g给系统和JVM overhead)
  • spark.executor.cores:每个Executor分配的CPU核心数,Glue的G.1X实例默认是4核,需与SageMaker实例的CPU核数匹配
  • spark.executor.memoryOverhead:堆外内存分配,Glue默认会设置为实例内存的25%左右,这是避免Off-Heap OOM的关键
  • spark.driver.memory & spark.driver.memoryOverhead:Driver节点的内存配置,需与Glue的Driver配置对齐

示例配置:

spark_processor.run(
    submit_app_arguments=[
        "--conf", "spark.executor.memory=12g",
        "--conf", "spark.executor.cores=4",
        "--conf", "spark.executor.memoryOverhead=4g",
        "--conf", "spark.driver.memory=16g",
        "--conf", "spark.driver.memoryOverhead=4g",
        "--conf", "spark.sql.shuffle.partitions=200"  # 对齐Glue的默认shuffle分区数
    ],
    application="s3://<你的作业代码路径>/your-spark-job.py"
)

3. 同步Glue特有的优化配置

Glue会自动设置一些针对S3、数据处理的优化参数,例如:

  • spark.hadoop.fs.s3a.multipart.size:S3分片上传大小
  • spark.sql.sources.partitionOverwriteMode:分区覆盖模式
  • spark.glue.*系列参数(如果你的作业依赖Glue Catalog)

这些参数都需要从Glue的配置日志中提取,添加到SageMaker的Spark配置里。

额外排查要点

如果配置对齐后仍出现OOM,需要排查:

  • 数据倾斜:查看Spark History Server(通过S3存储的Event Log启动),检查Stage中是否有单个Task处理的数据量远大于其他Task,这会导致单个Executor内存溢出
  • JVM垃圾回收配置:Glue默认会优化GC参数,可从Glue配置中提取spark.executor.extraJavaOptions参数,同步到SageMaker作业中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:10:31