【问题标题】:Problems using distcp and s3distcp with my EMR job that outputs to HDFS在输出到 HDFS 的 EMR 作业中使用 distcp 和 s3distcp 时出现问题
【发布时间】:2012-06-24 21:21:32
【问题描述】:

我在 AWS 的 EMR 上运行了一项作业,并将输出存储在 EMR 作业的 HDFS 中。然后我尝试通过 distcp 或 s3distcp 将结果复制到 S3,但两者都失败,如下所述。 (注意:我不只是将 EMR 作业的输出直接发送到 S3 的原因是由于我在 Where is my AWS EMR reducer output for my completed job (should be on S3, but nothing there)? 中描述的(当前未解决的)问题

对于 distcp,我运行(跟随this post's recommendation):

elastic-mapreduce --jobflow <MY-JOB-ID> --jar \
s3://elasticmapreduce/samples/distcp/distcp.jar \
    --args -overwrite \
    --args hdfs:///output/myJobOutput,s3n://output/myJobOutput \
    --step-name "Distcp output to s3"

在错误日志(/mnt/var/log/hadoop/steps/8)中,我得到:

With failures, global counters are inaccurate; consider running with -i
Copy failed: Status Code: 403, AWS Service: Amazon S3, AWS Request ID: <SOME-REQUEST-ID>, AWS Error Code: null, AWS Error Message: Forbidden, S3 Extended Request ID: <SOME-EXT-REQUEST-ID>
        at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:548)
        at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:288)
        at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:170)
...

对于 s3distcp,我运行(跟随 the s3distcp documentation):

elastic-mapreduce --jobflow <MY-JOB-ID> --jar \
s3://us-east-1.elasticmapreduce/libs/s3distcp/1.0.4/s3distcp.jar \
--args '--src,/output/myJobOutput,--dest,s3n://output/myJobOutput'

在错误日志(/mnt/var/log/hadoop/steps/9)中,我得到:

java.lang.RuntimeException: Reducer task failed to copy 1 files: hdfs://10.116.203.7:9000/output/myJobOutput/part-00000 etc
        at com.amazon.elasticmapreduce.s3distcp.CopyFilesReducer.close(Unknown Source)
        at org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:537)
        at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:428)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
        at org.apache.hadoop.mapred.Child.main(Child.java:249)      

任何想法我做错了什么?

更新:有人在 AWS 论坛上回复 post about a similar distcp error 提到了 IAM 用户用户权限,但我不知道这是什么意思编辑: 我没有创建任何 IAM 用户,所以它使用默认值);希望它有助于查明我的问题。

更新 2: 我在 namenode 日志文件中注意到此错误(重新运行 s3distcp 时)。我将查看默认 EMR 权限,看看是否是我的问题:

2012-06-24 21:57:21,326 WARN org.apache.hadoop.security.ShellBasedUnixGroupsMapping (IPC Server handler 40 on 9000): got exception trying to get groups for user job_201206242009_0005
org.apache.hadoop.util.Shell$ExitCodeException: id: job_201206242009_0005: No such user

    at org.apache.hadoop.util.Shell.runCommand(Shell.java:255)
    at org.apache.hadoop.util.Shell.run(Shell.java:182)
    at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:375)
    at org.apache.hadoop.util.Shell.execCommand(Shell.java:461)
    at org.apache.hadoop.util.Shell.execCommand(Shell.java:444)
    at org.apache.hadoop.security.ShellBasedUnixGroupsMapping.getUnixGroups(ShellBasedUnixGroupsMapping.java:68)
    at org.apache.hadoop.security.ShellBasedUnixGroupsMapping.getGroups(ShellBasedUnixGroupsMapping.java:45)
    at org.apache.hadoop.security.Groups.getGroups(Groups.java:79)
    at org.apache.hadoop.security.UserGroupInformation.getGroupNames(UserGroupInformation.java:966)
    at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.<init>(FSPermissionChecker.java:50)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5160)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkTraverse(FSNamesystem.java:5143)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:1992)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.getFileInfo(NameNode.java:837)
    ...

更新 3:我联系了 AWS Support,他们没有发现问题,所以现在正在等待他们的工程团队的回复。当我听到更多消息时会回复

【问题讨论】:

    标签: amazon-web-services elastic-map-reduce amazon-emr emr


    【解决方案1】:

    试试这个solution。至少它对我有用。 (我已经成功复制了 30Gb 文件的目录)。

    【讨论】:

    • 我确实碰巧在我的路径中包含了额外的斜杠,但正如我对这个问题的回答所述,我想我在指定我的 S3 路径时只是省略了存储桶名称:(该死的新手!跨度>
    【解决方案2】:

    我不是 100% 肯定的,但是在查看了我上面的命令之后,我注意到我在 S3 上的目的地没有指定存储桶名称。这似乎只是一个菜鸟主义的案例。

    【讨论】:

    • 哈!我认为查看您的消息的每个人都认为“输出”是您的存储桶的名称:)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多