如何让AWS Glue任务成功退出?sys.exit(0)被标记失败
解决AWS Glue中sys.exit(0)导致任务失败的问题
直接用sys.exit(0)在Glue环境里会被判定为异常终止,哪怕返回码是0也不行。要实现S3路径无文件时任务成功退出,按下面的方法操作:
步骤1:检查S3路径是否存在文件
可以用两种方式判断:
方式一:用boto3调用S3 API
import boto3 # 替换成你的桶名和目标路径前缀 s3_client = boto3.client('s3') bucket_name = "your-bucket" path_prefix = "target/path/" # 列出路径下的对象 response = s3_client.list_objects_v2(Bucket=bucket_name, Prefix=path_prefix) # 判断是否有有效文件(排除路径本身的前缀条目) has_files = 'Contents' in response and any(obj['Key'] != path_prefix for obj in response['Contents'])
方式二:用Spark的Hadoop文件系统API
from pyspark.context import SparkContext sc = SparkContext.getOrCreate() hadoop_conf = sc._jsc.hadoopConfiguration() fs = sc._jvm.org.apache.hadoop.fs.FileSystem.get(hadoop_conf) s3_path = sc._jvm.org.apache.hadoop.fs.Path("s3://your-bucket/target/path/") # 判断路径存在且有文件 has_files = fs.exists(s3_path) and fs.listStatus(s3_path).length > 0
步骤2:无文件时正常结束任务
不要用sys.exit,直接终止后续逻辑即可,Glue会识别为任务正常完成:
if not has_files: print("S3目标路径下无文件,任务正常结束") # 直接返回,不再执行后续ETL代码 return # 有文件时执行你的ETL逻辑 # ...(比如读取文件、数据转换、写入目标位置等操作)
如果需要主动触发任务终止,也可以用GlueContext的cancel_job方法(需确保IAM权限允许):
from awsglue.context import GlueContext glue_context = GlueContext(sc) if not has_files: glue_context.cancel_job()
内容的提问来源于stack exchange,提问作者Sudhanshu Prakash
相关产品推荐
相关产品推荐

