AWS EMR无法从私有S3 Bucket找到Mapper文件问题求助
解决EMR带SecurityConfiguration时无法访问私有S3桶中Mapper脚本的问题
看起来你遇到的核心问题是:当EMR集群启用了自定义SecurityConfiguration时,Hadoop Streaming无法将私有S3桶中的wordSplitter.py下载到任务容器中,导致找不到文件的错误。结合你的描述(移除安全配置后正常),问题大概率出在安全配置带来的权限或访问控制限制上,下面是具体的排查和解决步骤:
1. 确认EMR集群服务角色的权限
EMR集群需要通过其服务角色(默认是EMR_DefaultRole,如果是自定义角色则是你指定的角色)访问私有S3桶。你需要确保该角色拥有以下权限:
s3:GetObject:获取桶中的脚本文件s3:ListBucket:列出桶内的文件(用于Hadoop定位资源)
你可以在IAM控制台给该角色添加类似的权限策略:
{ "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::foobar", "arn:aws:s3:::foobar/*" ] }
2. 检查私有S3桶的桶策略
如果你的S3桶配置了自定义桶策略,要确保它没有拒绝EMR角色的访问,反而要显式允许该角色的操作。添加以下桶策略语句(替换你的账号ID和EMR角色ARN):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的AWS账号ID:role/你的EMR服务角色名" }, "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::foobar", "arn:aws:s3:::foobar/*" ] } ] }
注意:如果桶启用了Block Public Access,不用担心,EMR角色属于AWS内部身份,不会被这个设置限制。
3. 排查SecurityConfiguration中的S3相关设置
你的SecurityConfiguration可能包含了S3加密或访问控制规则,需要针对性调整:
- S3服务器端加密(SSE):
- 如果用的是SSE-S3:EMR默认支持,无需额外配置;
- 如果用的是SSE-KMS:需要给EMR服务角色添加
kms:Decrypt权限,指向加密该桶用的KMS密钥; - 如果用的是SSE-C:需要在Hadoop配置中指定加密密钥,这种场景比较少见,建议优先用前两种加密方式。
- VPC端点访问S3:如果SecurityConfiguration要求通过VPC端点访问S3,要确保:
- EMR集群部署在对应的VPC中;
- VPC端点的策略允许访问目标私有桶;
- 集群的路由表配置了指向VPC端点的路由。
4. 验证脚本的可用性与执行权限
- 先在EMR主节点手动测试下载脚本:
如果这个命令失败,说明是基础权限问题,先解决这个再跑Hadoop命令;如果能下载,再检查脚本的执行权限:aws s3 cp s3://foobar/hadoop-samples/wordSplitter.py .
然后重新上传回S3,或者在Hadoop命令中直接用Python执行脚本(跳过权限检查):chmod +x wordSplitter.pyhadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \ -files s3://foobar/hadoop-samples/wordSplitter.py \ -input s3://foobar/hadoop-samples/input \ -output s3://foobar/wordcount/output/ \ -mapper "python wordSplitter.py" \ -reducer aggregate \ -verbose
5. 确认Hadoop Streaming的-files参数用法
你当前的-files参数用法是正确的,它会自动将S3上的脚本复制到每个任务容器的工作目录中,所以mapper直接指定文件名wordSplitter.py是没问题的,不需要用S3全路径。
按照上面的步骤逐一排查,应该能在保留SecurityConfiguration的前提下解决文件找不到的问题。
内容的提问来源于stack exchange,提问作者Kyle Bridenstine
相关产品推荐
相关产品推荐

