2016-09-08 5 views
2

Я изо всех сил пытаюсь найти способ использования S3DistCp в моем кластере AWS EMR.Используйте S3DistCp для копирования файла с S3 в EMR

Некоторые старые примеры, показывающие, как добавить s3distcp в качестве шага EMR, используют команду elastic-mapreduce, которая больше не используется.

Некоторые другие источники предлагают использовать команду s3-dist-cp, которая не найдена в текущих кластерах EMR. Даже официальная документация (online и ОЕ руководство разработчика 2016 .pdf) Приведут пример, как это:

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,]+"] 

Но нет lib папки в /home/hadoop пути. Я нашел несколько библиотек хаопов в этой папке: /usr/lib/hadoop/lib, но я не могу найти s3distcp откуда угодно.

Затем я обнаружил, что в некоторых ведрах S3 есть некоторые библиотеки. Например, из этого question я нашел этот путь: s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar. Это казалось шагом в правильном направлении, так как добавление нового шага к работающему кластеру EMR из интерфейса AWS с этими параметрами начало шаг (который он не делал с предыдущими попытками), но не удался после ~ 15 секунд:

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 

Это привело к следующей ошибке:

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) 

Я думал, что это может быть вызвано несовместимостью моего S3 местоположения (же в качестве конечной точки) и расположение сценария s3distcp, который был от нас -восток. Я заменил его на eu-west-1 и по-прежнему получил ту же ошибку об аутентификации. Я использовал аналогичную настройку для запуска сценариев scala (Custom jar type с скриптом «command-runner.jar» с первым аргументом «spark-submit» для запуска искровой работы, и это работает, у меня не было этой проблемы с аутентификация раньше.

Что самое простой способ для копирования файлов из S3 в кластер ОГО? либо путем добавления дополнительного шага ОГО с AWS SDK (для Go Ланга) или как-то внутри свеча сценария Scala? или . от интерфейса AWS ОГО, но не из CLI, как мне нужна, чтобы быть автоматизирована

ответ

3

консоль, которая поставляется в установленной ОМ 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/

Что касается автоматизации, что его, конечно, разумно бросать команды в пользовательский шаг, когда «путь» к команде является просто «команда-runner.jar» а затем аргументом шага является сама команда.

Таким образом, в конечном счете, CLI код может сделать то же самое:

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

Спасибо!Я использовал 'aws s3 cp' раньше, но я не знаю, как я не думал использовать его вместе с' 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=.*.*] 

Спасибо за предыдущие ответы. Я застрял, но смог построить это, чтобы использовать dist-cp для копирования в emr из s3