您的位置:首页 > 运维架构

【hadoop蜜汁问题解决】Multioutputs按照key输出多个文件

2016-04-17 00:17 399 查看
每当碰到一个很久都没有解决的bug时,总是开始怀疑人生,而且还各种百度不到,那就更加痛不欲生,尤其是这种大项目,看源代码太累了。

所以一旦解决了,一定要趁热乎的时候赶紧记录下来,不管用的是哪种谜一样的方法,好的,进入正题。

简而言之,我是想让mapreduce输出多个文件,按照key来输出文件,百度一下就可以发现很多说利用multioutputs类就可以解决,有些给了一点代码,不过很多都不靠谱,这个时候看源代码就很好了,或者去官网看.

(不放点代码就没有人看呀!!)

Job job = new Job();
*
* FileInputFormat.setInputPath(job, inDir);
* FileOutputFormat.setOutputPath(job, outDir);
*
* job.setMapperClass(MOMap.class);
* job.setReducerClass(MOReduce.class);
* ...
*
* // Defines additional single text based output 'text' for the job
* MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class,
* LongWritable.class, Text.class);
*
* // Defines additional sequence-file based output 'sequence' for the job
* MultipleOutputs.addNamedOutput(job, "seq",
* SequenceFileOutputFormat.class,
* LongWritable.class, Text.class);
* ...
*
* job.waitForCompletion(true);
* ...
* </pre>
* <p>
* Usage in Reducer:
* <pre>
* <K, V> String generateFileName(K k, V v) {
* return k.toString() + "_" + v.toString();
* }
*
* public class MOReduce extends
* Reducer<WritableComparable, Writable,WritableComparable, Writable> {
* private MultipleOutputs mos;
* public void setup(Context context) {
* ...
* mos = new MultipleOutputs(context);
* }
*
* public void reduce(WritableComparable key, Iterator<Writable> values,
* Context context)
* throws IOException {
* ...
* mos.write("text", , key, new Text("Hello"));
* mos.
4000
write("seq", LongWritable(1), new Text("Bye"), "seq_a");
* mos.write("seq", LongWritable(2), key, new Text("Chau"), "seq_b");
* mos.write(key, new Text("value"), generateFileName(key, new Text("value")));
* ...
* }
*
* public void cleanup(Context) throws IOException {
* mos.close();
* ...
* }上面是是从hadoop1.2.1/src\mapred\org\apache\hadoop\mapreduce\lib\output的Multioutputs.class文件中拷贝出来的,当然有些些微的错误,认真阅读一下懂怎么写啦,给大家一点发挥空间。

我正常使用也没有错误,接着就让我崩溃了。说一下我的环境吧:

hadoop版本1.2.1 ,使用虚拟机搭建集群,用伪分布式跑hadoop,eclipse连接hadoop进行开发,怎么连接参考我之前的博客。

当我在reduce中使用mos.write时,如果输入文件大于2M,就说fail to create file以及spill failed,说map阶段溢出,reduce阶段打不开文件,这令人费解,难道是什么大小设置得不对,找半天都找不到,并且我没有Multioutput.addnameoutput,反正我就各种怀疑人生,然后没找出原因,然后不断试。

最后不再reduce中mos.write了,直接在map中mos.write,然后就好了,并且我发现Multioutput.addnameoutput()没有什么用呀,最后还是<span style="color:#FF0000;">mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a");
最后一个参数决定文件名,如果文件名中有/还会生成文件夹,应该和linux的文件结构一样。反正也是醉了,最后解决了就是。</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mapreduce bug 源代码