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é
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' :) –