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

如何编程方式正常终止无待处理数据的Glue job并返回成功状态?

问题原因

你使用sys.exit(0)时,Python会主动抛出SystemExit异常,而AWS Glue的作业运行环境默认会将未捕获的该类异常识别为作业执行错误,因此即便你传入的退出码为0,最终也会被标记为失败状态。

解决方法

方案1:直接终止主逻辑(最推荐)

无需调用sys.exit强制退出进程,在确认无新增数据、执行job.commit()后,直接结束后续代码执行即可,Glue作业走完所有代码逻辑后会自动判定为成功。
示例代码:

from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
job = Job(glueContext)
job.init(args["JOB_NAME"], args)

# 读取带书签的数据源
df = glueContext.create_dynamic_frame.from_catalog(
    database="your_database",
    table_name="your_table",
    transformation_ctx="datasource0"
).toDF()

if df.rdd.isEmpty():
    print("无新增待处理数据,作业正常结束")
    job.commit()
    # 无后续执行逻辑,作业自动结束
else:
    # 正常数据处理逻辑
    # ...
    job.commit()

如果你的判断逻辑写在自定义函数内,直接用return终止函数执行即可,不需要调用退出方法。

方案2:捕获SystemExit异常

如果你的代码结构必须通过sys.exit提前终止进程,可以在外层增加异常捕获逻辑,避免异常被Glue runtime识别为错误:

import sys
from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
job = Job(glueContext)
job.init(args["JOB_NAME"], args)

try:
    df = glueContext.create_dynamic_frame.from_catalog(
        database="your_database",
        table_name="your_table",
        transformation_ctx="datasource0"
    ).toDF()

    if df.rdd.isEmpty():
        print("无新增待处理数据,作业正常结束")
        job.commit()
        sys.exit(0)
    
    # 正常数据处理逻辑
    # ...
    job.commit()
except SystemExit as e:
    if e.code != 0:
        # 仅非0退出码重新抛出,标记作业失败
        raise
注意事项
  • 确认读取数据源时配置了正确的transformation_ctx参数,job.commit()会自动更新书签状态,不会影响下次调度读取新增数据。
  • 空数据判断逻辑要放在所有数据写入操作之前,避免无数据场景下误生成空文件或者写入脏数据。

内容的提问来源于stack exchange,提问作者Jérémy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:06:02