2016-09-08 4 views
2

J'ai du mal à trouver un moyen d'utiliser S3DistCp dans mon cluster AWS EMR.Utilisez S3DistCp pour copier le fichier de S3 vers EMR

Certains anciens exemples qui montrent comment ajouter s3distcp en tant qu'étape EMR utilisent la commande elastic-mapreduce qui n'est plus utilisée.

D'autres sources suggèrent d'utiliser la commande s3-dist-cp, qui n'est pas trouvée dans les clusters EMR actuels. Même les documents officiels (online et guide du développeur DME 2016 pdf) présentent un exemple comme celui-ci:

aws emr add-steps --cluster-id j-3GYXXXXXX9IOK --steps Type=CUSTOM_JAR,Name="S3DistCp step",Jar=/home/hadoop/lib/emr-s3distcp-1.0.jar,Args=["--s3Endpoint,s3-eu-west-1.amazonaws.com","--src,s3://mybucket/logs/j-3GYXXXXXX9IOJ/node/","--dest,hdfs:///output","--srcPattern,.*[azA-Z,]+"] 

Mais il n'y a pas de dossier lib dans le chemin /home/hadoop. J'ai trouvé quelques bibliothèques hadoop dans ce dossier: /usr/lib/hadoop/lib, mais je ne peux pas trouver s3distcp de n'importe où.

Ensuite, j'ai trouvé qu'il y a quelques bibliothèques disponibles dans certains compartiments S3. Par exemple, à partir de ce question, j'ai trouvé ce chemin: s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar. Cela a semblé être un pas dans la bonne direction, car l'ajout d'une nouvelle étape à un cluster EMR en cours d'exécution à partir de l'interface AWS avec ces paramètres a démarré l'étape (ce qui n'a pas été le cas avec les tentatives précédentes):

JAR location: s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar 
Main class: None 
Arguments: --s3Endpoint s3-eu-west-1.amazonaws.com --src s3://source-bucket/scripts/ --dest hdfs:///output 
Action on failure: Continue 

cela a donné lieu à l'erreur suivante:

Exception in thread "main" java.lang.RuntimeException: Unable to retrieve Hadoop configuration for key fs.s3n.awsAccessKeyId 
    at com.amazon.external.elasticmapreduce.s3distcp.ConfigurationCredentials.getConfigOrThrow(ConfigurationCredentials.java:29) 
    at com.amazon.external.elasticmapreduce.s3distcp.ConfigurationCredentials.<init>(ConfigurationCredentials.java:35) 
    at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.createInputFileListS3(S3DistCp.java:85) 
    at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.createInputFileList(S3DistCp.java:60) 
    at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:529) 
    at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:216) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) 
    at com.amazon.external.elasticmapreduce.s3distcp.Main.main(Main.java:12) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 

Je pensais que cela peut avoir été causé par l'incompatibilité de ma position S3 (comme le point final) et l'emplacement du script s3distcp, qui était de nous -est. Je l'ai remplacé par eu-west-1 et j'ai toujours la même erreur concernant l'authentification. J'ai utilisé une configuration similaire pour exécuter mes scripts scala (type jar personnalisé avec le script "command-runner.jar" avec le premier argument "spark-submit" pour lancer un étincelle et cela fonctionne, je n'ai pas eu ce problème avec l'authentification avant.

Quelle est la façon la plus simple de copier un fichier de S3 à un cluster de DME? soit en ajoutant une étape supplémentaire de DME avec AWS SDK (pour Go lang) ou en quelque sorte dans le script d'allumage Scala? ou . de l'interface AWS DME, mais pas de CLI comme je l'ai besoin pour être automatisé

Répondre

3

la CLI qui est installé dans le DME est aws <servicename> <function>:

enter image description here

aws s3 cp s3://bucket/path/to/remote/file.sh /local/path/to/file.sh

https://aws.amazon.com/cli/

En ce qui automatisant que son certainement raisonnable de jeter vos commandes dans une étape personnalisée où le « chemin » à la commande est simplement « commande runner.jar » et puis l'arg de l'étape est la commande elle-même.

Ainsi, en fin de compte, le code CLI peut faire la même chose:

aws emr add-steps --cluster-id j-2AXXXXXXGAPLF --steps Name="Command Runner",Jar="command-runner.jar",Args=["spark-submit","Args..."] 

http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-commandrunner.html

+1

Merci!J'avais utilisé 'aws s3 cp' avant mais je ne sais pas comment je n'ai pas pensé à l'utiliser avec' command-runner.jar' :) –

0
aws emr add-steps --profile <> --cluster-id <> --steps Type=CUSTOM_JAR,Name=UPLOAD_JAR_CONFIG,ActionOnFailure=CANCEL_AND_WAIT,Jar=command-runner.jar,Args=[s3-dist-cp,--src,s3a://<>/,--dest,hdfs:///<>/<>/,--srcPattern=.*.*] 

Merci pour les réponses précédentes. J'étais coincé mais j'ai pu construire ceci pour utiliser dist-cp pour copier vers emr à partir de s3