在Hadoop Streaming中生成单独输出文件
如果只用一个映射器(就是一个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。