Hadoop使用MultipleOutputs输出多文件或者指定命名
生活随笔
收集整理的這篇文章主要介紹了
Hadoop使用MultipleOutputs输出多文件或者指定命名
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Hadoop使用MultipleOutputs輸出多文件或者指定命名
@(HADOOP)[hadoop]
(一)輸出多文件(未測試)
比如將不同國家的信息分別輸出到一份對應的文件中。
1、在reduce或map類中創建MultipleOutputs對象,將結果輸出
class reduceStatistics extends Reducer<Text, IntWritable, Text, IntWritable>{ //將結果輸出到多個文件或多個文件夾 private MultipleOutputs<Text,IntWritable> mos; //創建對象 protected void setup(Context context) throws IOException,InterruptedException { mos = new MultipleOutputs<Text, IntWritable>(context); } //關閉對象 protected void cleanup(Context context) throws IOException,InterruptedException { mos.close(); } }2、在map或reduce方法中使用MultipleOutputs對象輸出數據,代替congtext.write()
Java代碼 收藏代碼
3、在創建job時,定義附加的輸出文件,這里的文件名稱與第二步設置的文件名相同
Java代碼 收藏代碼
(二)指定輸出命名
1、創建變量
private static MultipleOutputs<Text, Text> mos;2、初始化變量
在map或者reduce的setup()方法中初始化變量
mos = new MultipleOutputs<Text, Text>(context);3、使用變量代替context來write
在map()或者reduce()方法中使用mos作輸出:
mos.write("outputname", key, new Text(""));4、關于變量傳遞
在主類中定義的變量,如定義了一個outputname,需要將其寫入conf分發至其它nodemanager:
Configuration conf = new Configuration();//需要將變量分發至所有的nodemanagerconf.set("outputname", outputName);然后在map/reduce中從context獲取這個變量:
context.getConfiguration().get("outputname")5、關于part-**的輸出
使用multioutput改變了默認的輸出名稱后,原有的part-**也會輸出的,此時需要加上:
import org.apache.hadoop.mapreduce.lib.output.LazyOutputFormat; LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class);這將在有內容寫入文件時才創建文件,詳細可看:http://stackoverflow.com/questions/14555313/renaming-part-files-in-hadoop-map-reduce
另外,即使不使用multiOutput,如果任務輸出中有大量的空文件,也應加上這代碼。x
總結
以上是生活随笔為你收集整理的Hadoop使用MultipleOutputs输出多文件或者指定命名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在hadoop/hbase等代码中kin
- 下一篇: 在hadoop中传递变量