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

标签 amazon-s3 aws-sdk amazon-emr elastic-map-reduce s3distcp

我正在努力寻找在我的 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 秒后失败:
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 SDK(用于 Go lang)或以某种方式在 Scala spark 脚本中添加额外的 EMR 步骤?或者来自 AWS EMR 界面,但不是来自 CLI,因为我需要它自动化。

最佳答案

EMR 中自带的 CLI 是 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/

就自动化而言,将命令放入自定义步骤当然是合理的,其中命令的“路径”只是“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..."]

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

关于amazon-s3 - 使用 S3DistCp 将文件从 S3 复制到 EMR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39389940/

相关文章:

amazon-s3 - 使用 Snappy 压缩以 ORC 格式编写 Spark 数据帧

node.js - 如何在node.js中获取amazon s3存储桶中任何资源的最后访问日期?

hadoop - Amazon Elastic Map减少Hadoop作业

java - EMR 集群在 Step 状态下挂起 'Running/Pending'

JavaScript XMLHttpRequest 仅适用于检查器打开(Access-Control-Allow-Origin 错误)

html - 如何在html文件中添加图片?

node.js - 在不超过速率限制的情况下尽可能快地通过 SES 发送电子邮件

javascript - 错误 : Missing credentials in config -/nodeapp/node_modules/aws-sdk/lib/request. js:31

Java SDK AWS EMR 给出“下载失败”错误

amazon-s3 - 有没有办法使用aws cli检查s3中是否存在文件夹?