结合 AWS EMR 输出

Posted

技术标签:

【中文标题】结合 AWS EMR 输出【英文标题】:Combining AWS EMR output 【发布时间】:2014-11-13 22:39:53 【问题描述】:

我使用自定义映射器运行了一个测试 AWS EMR 作业,但使用 NONE 作为减速器。我在 13 个单独的“部分”文件中得到了(预期的)输出。如何将它们合并到一个文件中?

我不需要以任何特殊的方式聚合数据,我也不关心它是排序的、任意的重新排序的,还是按顺序排列的。但我想有效地将​​数据放回单个文件中。我必须手动执行此操作,还是有办法将其作为 EMR 集群的一部分执行?

对我来说很奇怪,没有默认选项或某种自动步骤可用。我已经阅读了一些关于 Identity Reducer 的内容。它做我想做的事吗?如果是,我在通过 EMR 控制台启动集群时如何使用它?

我的数据在 S3 中。


编辑

非常清楚,如果这是我必须做的,我可以在工作完成后对所有输出部分运行cat。在本地,或在 EC2 实例上,或其他任何地方。这真的是每个人都做的吗?

【问题讨论】:

看看this aws forum thread。 @DonRoby 是的,看到了。它已经 5 岁了,而且不是很有帮助。通过控制台启动作业时如何提供-jobconf mapred.reduce.tasks=1?我如何判断这是否是一个坏主意? 我没有给出答案,因为我自己没有机会尝试。了解这是否是一个好主意的最佳方法可能是根据您的实际情况进行尝试。听起来对性能的影响差异很大,具体取决于您已经拥有的代码是否实际上减少了数据量。 @DonRoby 好的。由于它是一个没有 reduce 的映射器,所以它根本不会减少数据量。事实上,它通过将结果附加到输入行来显着增加音量。我希望有人能告诉我,手动对我的数据运行 cat 是否比 Amazon EMR 可以做的任何事情都快。 【参考方案1】:

如果映射器部分文件本身的输出很小,那么您可以尝试使用hadoop fs -getmerge 将它们合并到本地文件系统:

hadoop fs -getmerge s3n://BUCKET/path/to/output/ [LOCAL_FILE]

然后将合并后的文件放回S3:

hadoop fs -put [LOCAL_FILE] s3n://BUCKET/path/to/put/

要使上述命令正常工作,您应该在core-site.xml 中设置以下属性

<property>
  <name>fs.s3n.awsAccessKeyId</name>
  <value>YOUR_ACCESS_KEY</value>
</property>

<property>
  <name>fs.s3n.awsSecretAccessKey</name>
  <value>YOUR_SECRET_ACCESS_KEY</value>
</property>

【讨论】:

以上是关于结合 AWS EMR 输出的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jupyter 中显示完整输出不仅是最后一个结果 - 对于 aws emr pyspark

在插入语句中使用语句 HIVE EMR AWS

如何手动使 AWS EMR 步骤失败

将文件从 AWS EMR 集群中的映射器上传到 S3

如何在 AWS EMR 中启动辅助 Namenode

将 AWS Appsync 与 AWS Neptune 结合使用