在Hadoop Streaming中生成单独输出文件

9 投票
3 回答
4382 浏览
提问于 2025-04-15 15:23

如果只用一个映射器(就是一个Python脚本),不使用归约器,我该怎么做才能让每一行输出都生成一个单独的文件,并且文件名是对应的键,而不是把所有输出都放在一个很长的文件里呢?

3 个回答

1

在使用流式处理的时候,能不能替换输出格式类呢?

在原生的Java实现中,你可以扩展MultipleTextOutputFormat类,然后修改那个负责命名输出文件的方法。接着,通过JobConf的setOutputFormat方法来定义你自己的输出格式。

不过,你得确认一下在流式处理里是不是也能这样做。我也不太清楚 :-/

7

输入和输出格式的类可以通过使用 -inputformat 和 -outputformat 这两个命令行参数来替代。

一个具体的例子可以在 dumbo项目 中找到,这个项目是一个用Python编写流式作业的框架。它有一个功能可以写入多个文件,并且在内部用它的姐妹项目 feathers 中的一个类来替换输出格式,那个类叫做 fm.last.feathers.output.MultipleTextFiles.

然后,reducer(归约器)需要输出一个元组作为键,其中元组的第一个部分是存放键/值对文件的目录路径。可能会有多个文件,这取决于归约器的数量和应用的具体情况。

我建议你看看dumbo,它有很多功能,可以让你在Hadoop上用Python更轻松地编写Map/Reduce程序。

1

你可以选择用Python的文件功能把内容写入本地的文本文件,或者如果你想使用HDFS(分布式文件系统),可以使用Thrift API

撰写回答