我正在实现需要在多个 S3 对象中创建输出的 Hadoop Map reduce 作业。Hadoop 本身只创建一个输出文件(一个 S3 对象),但我需要将输出划分为多个文件。
我如何实现这一目标?
我通过使用 S3 工具包将输出直接从我的 reducer 方法写入 S3 来做到这一点。因为我在 EC2 上运行,所以这是快速且免费的。
一般来说,您希望 Hadoop 尽可能多地处理您的输入和输出,以实现更简洁的映射器和化简器;当然,您希望在管道的最后写入 S3,让 Hadoop 的代码移动在 HDFS 上完成工作。
在任何情况下,我都建议您对所有数据进行分区,并在最终的 reduce 任务中将整个输出集写入 S3,每个 S3 文件一组。这会在您的代码中尽可能少地添加编写器逻辑。这让我得到了回报,因为我最终得到了一个用于多个任务流的最小 Hadoop S3 工具包。
我需要在我的 reducer 代码中写入 S3,因为 S3/S3n 文件系统还不成熟;他们现在可能工作得更好。
你也知道MultipleOutputFormat吗?它与 S3 无关,但通常它允许将输出写入多个文件,实现给定的逻辑。