如何编程方式正常终止无待处理数据的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
相关产品推荐
相关产品推荐

