在 MRJob 中运行步骤之前将 S3 数据加载到 HDFS 的特定语法示例是啥?

Posted

技术标签:

【中文标题】在 MRJob 中运行步骤之前将 S3 数据加载到 HDFS 的特定语法示例是啥?【英文标题】:What is a specific syntax example to load S3 data to HDFS prior to running steps in MRJob?在 MRJob 中运行步骤之前将 S3 数据加载到 HDFS 的特定语法示例是什么? 【发布时间】:2014-07-11 07:19:01 【问题描述】:

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

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

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。我开始认为我应该在 CLI 上的 --jobconf 下传递 java 命令,以便它与 S3DistCp 文档保持一致。

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

【问题讨论】:

【参考方案1】:

如果你想将单个文件复制到你的 hdfs 使用下面的命令

hadoop fs -cp s3:/// 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,]+'

【讨论】:

感谢 Sandesh 的快速响应。我正在尝试将该命令包含在用于启动 EMR 实例的命令或 MRJob 脚本中。据我了解,您列出的两个选项要求 EMR 已经在运行。您是否知道 MRJob 脚本中的示例,作为 MRJob bash 命令的一部分以启动作业或在 conf 文件中? 我希望有人能给你答案,我也遇到了同样的问题

以上是关于在 MRJob 中运行步骤之前将 S3 数据加载到 HDFS 的特定语法示例是啥?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue,加载到框架之前的数据过滤,命名 s3 对象

使用 MRJob 将作业提交到 EMR 集群

Mrjob 步骤失败。怎么调试?

在 S3 中运行 COPY 命令以将 gzip-ed 数据加载到 Redshift

将 s3 的 pg_dump 加载到 redshift

aws Glue / Redshift 的预过滤解决方案(在加载到 S3 之前)