2012-06-24 3 views
1

Я выполнил задание по EMR AWS и сохранил вывод в HDFS-задании задания EMR. Затем я пытаюсь скопировать результат на S3 через distcp или s3distcp, но оба они не работают, как описано ниже. (Примечание: Причина, почему я не просто посылая выход моих ЭХ заданий непосредственно на S3 связано с (в настоящее время нерешенной) проблемы, которую я описал в Where is my AWS EMR reducer output for my completed job (should be on S3, but nothing there)?Проблемы с использованием distcp и s3distcp с моим заданием EMR, которое выводится на HDFS

Для 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" 

В журнале ошибок (/ мнт/вар/журнал/Hadoop/шаги/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' 

В журнале ошибок (/ мнт/вар/Журнал/Hadoop/шаги/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)  

Любые идеи, что я делаю неправильно?

Update: Кто-то реагирует на Форумах АМС к post about a similar distcp error упоминает IAM права доступа пользователей пользователя, , но я не знаю, что это означает (редактирование: Я не создал ни одного IAM пользователей, так он использует значения по умолчанию); надеюсь, это помогает определить мою проблему.

Update 2: Я заметил эту ошибку в лог-файл NameNode (когда повторный запуск s3distcp) .. Я буду смотреть в разрешениях ЭМИ по умолчанию, чтобы увидеть, если это моя проблема:

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, и они не видят проблемы, поэтому я жду, чтобы услышать от их инженерной команды. Отослать ответ, если я слышу больше

ответ

0

Я не на 100% положителен, но после рассмотрения моих команд выше, я заметил, что мой пункт назначения на S3 НЕ указывает имя ведра. Кажется, это просто случай новобранец.

+0

Ха! Я думаю, все, кто ваше сообщение предположило, что «выход» - это имя вашего ведра :))) – denys

1

Попробуйте это solution. По крайней мере, это сработало для меня. (Я успешно скопировал каталог с файлом 30Gb).

+0

Я случайно включил дополнительный слэш для своего пути, но, как я уже сказал на этом вопросе, я просто оставил имя ведра, указав мой путь S3: (damn rookies! –