2013-11-26 62 views
2

我是Hadoop的新手! 現在我試圖用hadoop 2.2.0來使用MultipleOutputFormat,但它似乎只適用於棄用的'JobConf',後者反過來使用棄用的Mapper和Reducer(org.apache.hadoop.mapred.Reducer)等。任何想法如何通過新的'org.apache.hadoop.mapreduce.Job'實現多個輸出功能?使用org.apache.hadoop.mapreduce.Job支持Hadoop MultipleOutputFormat

+4

改爲使用MultipleOutputs。 –

回答

1

由於@JudgeMental指出,你應該使用MultipleOutputs與新的API(mapreduce),因爲MultipleOutputFormat只支持舊的API(mapred)。 MultipleOutputs實際上爲您提供更多的功能比MultipleOutputFormat

  • 隨着MultipleOutputs,每路輸出都可以有自己OutputFormat,而與MultipleOutputFormat每個輸出具有相同OutputFormat
  • MultipleOutputFormat比起MultipleOutputs,您可以更好地控制命名方案和輸出目錄結構。
  • 您可以在同一作業中使用mapreduce函數中的MultipleOutputs,這是MultipleOutputFormat無法做到的。
  • 您可以通過MultipleOutputs爲不同的輸出使用不同的鍵和值類型。

因此,兩者並不相互排斥,即使MultipleOutputs具有更多功能,但重新命名功能的靈活性較差。

要學習如何使用MultipleOutputs,您應該看看包含完整示例的this documentation。總之,這裏是你放什麼在驅動程序類:

// 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); 

而在你MapperReducer你應該只是初始化MultipleOutputssetupMultipleOutputs mos = new MultipleOutputs(context);,然後你可以在mapreduce使用功能爲mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a")。不要忘記用mos.close()cleanup方法中關閉它!

+0

非常感謝! – user2926672