我正在Amazon的Elastic MapReduce上运行Python流工作,该工作需要从reducer输出多个文件。我在网络上找到的关于如何执行此操作的描述都已过时,因此它们引用了已弃用的属性mapred.work.output.dir
,但是当我尝试在现代等效项mapreduce.task.output.dir
(即用于流作业的mapreduce_task_output_dir
)指向的目录中创建文件时)我收到“找不到文件或目录”错误:
OSError: [Errno 2] No such file or directory: 's3://mybucket-data/output/encounter/_temporary/1/_temporary/attempt_1416321762038_0001_r_000003_0'
FileOutputFormat.getWorkOutputPath()的文档似乎表明这应该仍然有效。
我怀疑问题与指向S3有关,但是我不知道我是否应该使用其他(即本地)目录(如果需要,我需要什么属性?)或想出如何使Python写入S3还是...?
最佳答案
过去收到此错误时,是因为我没有为我的EMR群集正确定义IAM角色。
您的IAM角色针对EMR群集的操作中是否包含“s3:*”?
例如:
{
"Statement": [
{
"Action": [
"cloudwatch:*",
"ec2:Describe*",
"elasticmapreduce:Describe*",
"s3:*",
"sdb:*",
"sns:*",
"sqs:*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
借助IAM角色,AWS服务有权对其他AWS资源采取行动。在您的实例中,您可能需要授予您的EMR群集写S3的权限,否则您将收到一条错误消息,指出未找到S3存储桶。
Amazon提供了有关设置EMR IAM角色的基础知识的快速教程:
http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-iam-roles.html
关于python - 如何在AWS Elastic MapReduce上使用Python流创建 “side-effect”文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27000230/