Glue写入Redshift报错Unrecognized scheme null 预期s3/s3n/s3a问询
AWS Glue写入Redshift报错
Unrecognized scheme null; expected s3, s3n, or s3a排查方案 根因说明
该报错是写入Redshift时调用的临时目录参数没有传入合法S3路径,路径前缀缺失或参数为空导致路径协议(scheme)被识别为null,不符合S3路径要求。
排查步骤
- 检查Glue作业运行参数配置:确认你配置的TempDir临时目录参数取值为完整S3路径,格式必须为
s3://<bucket名称>/<自定义临时目录路径>/,禁止仅填写桶名、遗漏s3://前缀。 - 检查作业参数传递逻辑:如果TempDir通过作业参数传入,确认参数键为
--TempDir(前缀两个短横线不可省略),缺失前缀会导致args["TempDir"]返回空值,触发该报错。 - 验证S3临时目录权限:确认Glue作业关联的IAM角色对该S3路径拥有
s3:PutObject、s3:GetObject、s3:ListBucket权限,权限不足会导致路径读取失败返回null。
临时验证方案
你可以先把redshift_tmp_dir替换为固定的合法S3路径测试,确认问题是否由参数传递错误导致,示例如下:
sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "data_input", table_name = "db_public_trx", transformation_ctx = "datasource0") datasource1 = glueContext.create_dynamic_frame.from_catalog(database = "data_output", table_name = "redshiftdev_public_trx", transformation_ctx = "datasource1") src_df = datasource0.toDF() dst_df = datasource1.toDF() merged_df = dst_df.union(src_df) datasource3 = fromDF(merged_df,glueContext,"datasource3") # 仅需修改redshift_tmp_dir取值,替换为你自己的S3临时目录路径 datasink = glueContext.write_dynamic_frame.from_catalog( frame = datasource3, database = "data_output", table_name = "redshiftdev_public_trx", redshift_tmp_dir = "s3://<你的S3桶名>/glue_temp/", transformation_ctx = "datasink" ) job.commit()
额外注意事项
- Glue 4.0及以上版本默认使用s3a作为S3文件系统协议,临时路径前缀写
s3://即可,无需手动修改为s3a,Glue会自动适配。 - 临时目录路径末尾建议加斜杠结尾,避免路径拼接出错。
内容的提问来源于stack exchange,提问作者Muhammad Ariq Naufal
相关产品推荐
相关产品推荐

