我正在努力寻找在我的 AWS EMR 集群中使用 S3DistCp 的方法。
一些旧示例展示了如何将 s3distcp 添加为 EMR 步骤使用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,]+"]
但是路径中没有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
这导致了以下错误:
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 位置(与端点相同)与来自 us-east 的 s3distcp 脚本的位置不兼容造成的。我用 eu-west-1 替换了它,但仍然遇到关于身份验证的相同错误。我使用了类似的设置来运行我的 scala 脚本(带有“command-runner.jar”脚本的自定义 jar 类型,第一个参数“spark-submit”来运行 spark 作业,这很有效,我没有遇到这个问题之前的认证。
将文件从 S3 复制到 EMR 集群的最简单方法是什么?通过使用 AWS 开发工具包(用于 Go 语言)或以某种方式在 Scala spark 脚本中添加额外的 EMR 步骤?或者来自 AWS EMR 界面,但不是来自 CLI,因为我需要它自动化。