2012-06-24 1 views
1

J'ai exécuté un travail sur le système EMR d'AWS et stocké la sortie dans le fichier HDFS du travail EMR. J'essaye alors de copier le résultat à S3 via distcp ou s3distcp, mais les deux échouent comme décrit ci-dessous. (Note: la raison pour laquelle je ne suis pas seulement d'envoyer ma sortie de travail de DME directement à S3 est en raison du problème (actuellement non résolue) Je décris dans Where is my AWS EMR reducer output for my completed job (should be on S3, but nothing there)?Problèmes lors de l'utilisation de distcp et s3distcp avec mon travail EMR en sortie vers HDFS

Pour distcp, je cours (suivant 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" 

Dans le journal des erreurs (/ mnt/var/log/Hadoop/étapes/8), je reçois:

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) 
... 

Pour s3distcp, je cours (suivant 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' 

Dans le journal des erreurs (/ mnt/var/log/Hadoop/étapes/9), je reçois:

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)  

Toutes les idées ce que je fais mal?

Mise à jour: Quelqu'un répondre sur les forums AWS à un post about a similar distcp error mentionne les autorisations utilisateur utilisateur IAM, mais je ne sais pas ce que cela signifie (modifier: Je n'ai pas créé tous les utilisateurs IAM, donc il utilise les valeurs par défaut); J'espère que cela aide à identifier mon problème.

Mise à jour 2: Je remarqué cette erreur dans le fichier journal de NameNode (quand s3distcp réexécution) .. Je vais examiner les autorisations par défaut de DME pour voir si elle est mon problème:

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) 
    ... 

Mise à jour 3: J'ai contacté AWS Support, et ils n'ont vu aucun problème, alors j'attends maintenant de recevoir des nouvelles de leur équipe d'ingénierie. Je reviendrai au fur et à mesure que j'entendrai plus

Répondre

0

Je ne suis pas 100% positif, mais après avoir examiné mes commandes ci-dessus, j'ai remarqué que ma destination sur S3 ne spécifie pas un nom de compartiment. Cela semble être simplement un cas de recrue-isme.

+0

Ha! vu votre message supposé que "sortie" est un nom de votre seau :))) – denys

1

Essayez ceci solution. Au moins, cela a fonctionné pour moi. (J'ai copié avec succès le dossier avec le dossier 30Gb).

+0

Il m'arrivait d'inclure le slash supplémentaire pour mon chemin, mais comme ma réponse à cette question indique, je pense que j'ai simplement laissé le nom de seau en spécifiant mon chemin S3 :(fous rookies! –

Questions connexes