如何在AWS Elastic MapReduce上使用Python流创建“副作用”文件?

时间:2014-11-18 17:23:24

标签: python hadoop amazon-web-services amazon-s3 emr

我正在亚马逊的Elastic MapReduce上运行一个Python流媒体作业,它需要从reducer输出多个文件。我在网上找到的关于如何执行此操作的描述都已经过时,因此它们引用了已弃用的属性mapred.work.output.dir,但是当我尝试在现代等效项指向的目录中创建文件时,{{1 (即mapreduce.task.output.dir用于流式传输作业)我收到文件或目录未找到错误:

mapreduce_task_output_dir

FileOutputFormat.getWorkOutputPath()的文档似乎表明这仍然有用。

我怀疑问题与指向S3有关,但我不知道我是否应该使用不同的(即本地)目录(如果是这样,我需要什么属性?)或弄清楚如何让Python写入S3或......?

1 个答案:

答案 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