我正在努力寻找在我的AWS EMR集群中使用S3DistCp的方法。
一些旧示例显示如何将s3distcp添加为EMR步骤使用elastic-mapreduce
命令,该命令不再使用。
其他一些消息来源建议使用s3-dist-cp
命令,这在当前的EMR集群中找不到。甚至官方文档(online和EMR开发人员指南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
个文件夹。我在此文件夹中找到了一些hadoop库:/usr/lib/hadoop/lib
,但我无法从任何地方找到s3distcp
。
然后我发现某些S3存储桶中有一些库可用。例如,通过此question,我找到了这条路径:s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar
。这似乎是朝着正确方向迈出的一步,因为从AWS界面向正在运行的EMR集群添加一个新步骤,这些参数启动了这一步骤(它没有与之前的尝试相同)但在~15秒后失败:< / p>
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脚本(来自us-east)的位置不兼容造成的。我用eu-west-1替换它并且仍然得到关于身份验证的相同错误。 我使用类似的设置来运行我的scala脚本(自定义jar类型使用&#34; command-runner.jar&#34;脚本使用第一个参数&#34; spark-submit&#34;运行一个spark作业,这个有效,我以前没有遇到过这个问题。
将文件从S3复制到EMR集群的最简单方法是什么?要么通过AWS SDK(Go lang)添加额外的EMR步骤,要么在Scala spark脚本中添加某些内容?或者从AWS EMR界面,但不是从CLI,因为我需要它自动化。
答案 0 :(得分:5)
EMR中安装的CLI为aws <servicename> <function>
:
aws s3 cp s3://bucket/path/to/remote/file.sh /local/path/to/file.sh
就自动化而言,将命令放入自定义步骤肯定是合理的,其中命令的“路径”只是“command-runner.jar”,然后步骤的arg就是命令本身。 / p>
因此,最终,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 :(得分: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从s3复制到emr