当我运行我的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个链接,但谷歌搜索会提供更多信息)
我的方法是在MRJob脚本的步骤方法中将JarStep作为MRStep之前的一步。我试图将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(...)
]
我已经尝试了一些变体,有或没有引号或引号分割输入和输出或逗号之间的空格。我得到的错误主要是&#34;线程&#39;主要&#39;中的异常。 java.lang.RuntimeException:Argument --src ,, - desc ,,不匹配。
我发现的例子类似于以下内容:
args=['naive-bayes', JarStep.INPUT, JarStep.OUTPUT]
不清楚JarStep.INPUT是否应该被替换或在别处定义。我开始认为我应该在--jobconf下的CLI上传递java命令,以便它与S3DistCp文档对齐。
任何想法或只是简单的例子,请发送我的方式。
答案 0 :(得分:0)
如果您希望将单个文件复制到hdfs use命令,如下所示
hadoop fs -cp s3://&lt; s3bucket&gt; /&lt;路径&gt; HDFS:///输出
或使用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:///输出'\ --arg --srcPattern --arg'。* [a-zA-Z,] +'