本地AWS Glue 4.0 Docker加载S3文件触发AWSBadRequestException排查
AWS Glue 4.0 Docker镜像本地加载S3文件报错问题
问题描述
我一直在使用AWS Glue 4.0 Docker镜像进行ETL任务的本地开发与测试,处理DynamoDB导出数据时一切正常,但加载S3上的文件时遇到问题。
我有一批从AWS CloudWatch导出的文件需加载到数据湖,配置的DynamicFrame代码如下:
df_raw = glueContext.create_dynamic_frame_from_options( connection_type="s3", connection_options={ "paths": [ f"s3://{audit_logs_source_bucket}/exports/aws-cloudwatch/logs/audit/access-logs/api/apigw/", ], "recurse": True, "exclusions": json.dumps([ "aws-logs-write-test", ]), }, format="grokLog", format_options={ "logFormat": r"%{NOTSPACE:timestamp}%{SPACE}%{GREEDYDATA:msg}", }, transformation_ctx="load_new_logs", )
执行代码时(训练账号已配置管理员权限)出现如下异常:
Py4JJavaError: An error occurred while calling o72.getDynamicFrame. : org.apache.hadoop.fs.s3a.AWSBadRequestException: getFileStatus on s3://bucket-operators-data-export-eu-west-1-rnd/exports/aws-cloudwatch/logs/audit/access-logs/api/apigw: com.amazonaws.services.s3.model.AmazonS3Exception: Bad Request
相同代码在AWS Glue交互式会话中可正常运行,请问哪里操作有误?
排查与解决方向
1. 本地Docker环境的AWS认证问题
虽然账号有管理员权限,但本地Glue Docker镜像的认证逻辑和交互式会话不同:
- 检查本地环境变量是否正确设置
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY,使用临时凭证时还需添加AWS_SESSION_TOKEN - 确认启动Docker容器时是否挂载了本地AWS配置目录,让容器能读取
~/.aws/credentials和~/.aws/config:docker run -v ~/.aws:/root/.aws ... <glue-4.0-image>
2. S3端点与区域配置不匹配
Glue Docker镜像默认的S3端点可能和你的bucket所属区域(eu-west-1)不一致:
- 在代码中显式指定S3区域对应的端点:
from pyspark.context import SparkContext sc = SparkContext.getOrCreate() hadoop_conf = sc._jsc.hadoopConfiguration() hadoop_conf.set("fs.s3a.endpoint", "s3.eu-west-1.amazonaws.com") - 也可以在启动Docker容器时通过环境变量指定区域:
-e AWS_REGION=eu-west-1
3. Hadoop S3A客户端兼容性配置
Glue 4.0对应的Hadoop版本在处理部分S3请求时需额外配置:
- 如果bucket名称包含特殊字符,添加路径式访问配置:
hadoop_conf.set("fs.s3a.path.style.access", "true")
4. 路径与排除规则格式验证
- 尝试将
exclusions参数直接传入列表(部分Glue版本支持直接传列表而非JSON字符串):"exclusions": ["aws-logs-write-test"] - 验证S3路径是否正确,可尝试去掉路径末尾的斜杠进行测试
内容的提问来源于stack exchange,提问作者Martin Macak
相关产品推荐
相关产品推荐

