我正在亚马逊的Elastic MapReduce上运行一个Python流媒体作业,它需要从reducer输出多个文件。我在网上找到的关于如何执行此操作的描述都已经过时,因此它们引用了已弃用的属性mapred.work.output.dir
,但是当我尝试在现代等效项指向的目录中创建文件时,{{1 (即mapreduce.task.output.dir
用于流式传输作业)我收到文件或目录未找到错误:
mapreduce_task_output_dir
FileOutputFormat.getWorkOutputPath()的文档似乎表明这仍然有用。
我怀疑问题与指向S3有关,但我不知道我是否应该使用不同的(即本地)目录(如果是这样,我需要什么属性?)或弄清楚如何让Python写入S3或......?
答案 0 :(得分:2)
当我在过去收到此错误时,原因是我没有为我的EMR群集正确定义IAM角色。
您的EMR群集的IAM角色操作中是否包含“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