0

当我运行我的 MRJob 脚本并使用 CLI 为工作启动 EMR 集群时,我试图弄清楚如何将数据从 S3 加载到集群中的 HDFS 上。我想将此作为设置过程的一部分。

我搜索了许多地方以深入了解与 MRJob 一起使用的正确语法,以便将我的 S3 数据预加载到 HDFS 中。我仍在了解术语和流程。

MRJob 在其文档中提到了 JarStep 和 Hadoop Streaming:https ://pythonhosted.org/mrjob/guides/writing-mrjobs.html

Yelp 对此有一个讨论主题:https ://github.com/Yelp/mrjob/pull/665

AWS 有一个工具 S3DistCp 来提供加载语法,并且示例与 Java 相关。(我不能发布超过 2 个链接,但谷歌搜索会提供更多信息)

我的方法是将 JarStep 作为 MRStep 之前的一个步骤包含在我的 MRJob 脚本的步骤方法中。我试图将 S3DistCp 命令作为参数传递。

 def steps(self):
     return [JarStep(name='jar-step', jar='s3://<bucket to jar file>', 
                     args=['--src,s3://<bucket to data>, --dest,hdfs:///<bucket>']),
             MRStep(...)
             ]

我已经尝试了一些变体,有无引号或引号分隔输入和输出或逗号之间的空格。我得到的主要错误是“线程'main'java.lang.RuntimeException中的异常:参数--src,,--desc,,不匹配。

我发现的示例类似于以下内容:

args=['naive-bayes', JarStep.INPUT, JarStep.OUTPUT]

不清楚 JarStep.INPUT 是否应该被替换或在其他地方定义。我开始认为我应该在 --jobconf 下的 CLI 上传递 java 命令,以便它与 S3DistCp 文档保持一致。

任何想法或只是简单的例子,请发送给我。

4

1 回答 1

0

如果您希望将单个文件复制到您的 hdfs,请使用如下命令

hadoop fs -cp s3://<s3bucket>/<路径> hdfs:///output

或使用 S3DistCp 如下

./elastic-mapreduce --jobflow j-3GY8JC4179IOJ --jar \ /home/hadoop/lib/emr-s3distcp-1.0.jar \ --arg --s3Endpoint --arg 's3-eu-west-1.amazonaws。 com' \ --arg --src --arg 's3://myawsbucket/logs/j-3GY8JC4179IOJ/node/' \ --arg --dest --arg 'hdfs:///output' \ --arg --srcPattern --arg '.*[a-zA-Z,]+'

于 2014-07-11T09:22:03.130 回答