使用S3DistCp将文件从S3复制到EMR

V. *_*mma 5 amazon-s3 amazon-emr elastic-map-reduce aws-sdk s3distcp

我正在努力寻找一种在我的AWS EMR集群中使用S3DistCp的方法。

一些旧示例显示了如何将s3distcp添加为EMR步骤use elastic-mapreduce命令,该命令已不再使用。

其他一些消息来源建议使用s3-dist-cp命令,该命令在当前EMR群集中找不到。甚至官方文档(在线和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,]+"]
Run Code Online (Sandbox Code Playgroud)

但是路径中没有lib文件夹/home/hadoop。我在此文件夹中找到了一些hadoop库:/usr/lib/hadoop/lib,但找不到s3distcp任何地方。

然后我发现在某些S3存储桶中有一些可用的库。例如,从这个问题中,我找到了以下路径:s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar。这似乎是朝着正确方向迈出的一步,因为使用这些参数从AWS界面向正在运行的EMR集群添加了一个新步骤,从而开始了该步骤(之前没有尝试过该步骤),但在约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
Run Code Online (Sandbox Code Playgroud)

这导致以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

我认为这可能是由于我的S3位置(与端点相同)和s3distcp脚本的位置(来自美国东部)不兼容引起的。我用eu-west-1替换了它,但仍然收到有关身份验证的相同错误。我已经使用了类似的设置来运行我的Scala脚本(带有“ command-runner.jar”脚本的自定义jar类型,其第一个参数为“ spark-submit”,以运行Spark作业,并且此方法有效,但我没有在使用认证之前。

将文件从S3复制到EMR群集的最简单方法是什么?通过在AWS开发工具包中添加额外的EMR步骤(用于Go lang)还是在Scala spark脚本中以某种方式添加?或来自AWS EMR界面,但不来自CLI,因为我需要将其自动化。

Kri*_*ian 6

EMR中安装的CLI是aws <servicename> <function>

在此处输入图片说明

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

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

至于自动执行,将命令放入自定义步骤中当然是合理的,其中命令的“路径”只是“ command-runner.jar”,然后该步骤的arg是命令本身。

因此,最终,CLI代码可以完成相同的操作:

aws emr add-steps --cluster-id j-2AXXXXXXGAPLF --steps Name="Command Runner",Jar="command-runner.jar",Args=["spark-submit","Args..."]
Run Code Online (Sandbox Code Playgroud)

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