mapreduce 多文件輸出新API續

    對於上一篇hadoop mapreduce 多文件輸出,有一些地方介紹的不許確,這裏作個續簡單更正一下,同時正好解決了上一篇的不能多文件夾輸出的問題 java

    一、針對於上一篇代碼中的 MultipleOutputs.addNamedOutput(job, "errorlog",
    TextOutputFormat.class, Text.class, NullWritable.class);  方法,其實第二個參數並不是是這麼用的,下面看代碼:
ide

private MultipleOutputs<NullWritable, Text> multipleOutputs = null;
	@Override
	protected void reduce(IntWritable key, Iterable<Text> values,Context context)
			throws IOException, InterruptedException {
		for(Text val:values){
			multipleOutputs.write("KeySplit", NullWritable.get(), val, key.toString()+"/");
			multipleOutputs.write("AllData", NullWritable.get(), val);
		}
	}

write函數不少重載方法,以前用的是三個參數的,這個方法實際上是將全部的reduce輸出都輸出到一個文件夾中, 函數

這時候咱們在調用MultipleOutputs.addNamedOutput()函數的時候傳遞的第二個參數爲多個,因此會致使 oop

-rw-r--r--   2 hadoop supergroup   10569073 2014-06-06 11:50 /test/aa/fileRequest-m-00063.lzo
-rw-r--r--   2 hadoop supergroup   10512656 2014-06-06 11:50 /test/aa/fileRequest-m-00064.lzo
-rw-r--r--   2 hadoop supergroup      68780 2014-06-06 11:51 /test/aa/firstIntoTime-m-00000.lzo
-rw-r--r--   2 hadoop supergroup      67901 2014-06-06 11:51 /test/aa/firstIntoTime-m-00001.lzo
spa

這樣的現象,並且會多輸出不少沒有用的空文件 code

那麼其實write方法有一個帶有四個參數的方法,最後一個參數就恰巧是傳遞一個目錄進去,目的是針對於不一樣的邏輯將reduce產生的數據輸出到不一樣的文件夾目錄下。如第一段代碼中的multipleOutputs.write("KeySplit", NullWritable.get(), val, key.toString()+"/");語句,最後一個參數的做用就是相將key做爲文件夾,將具備相同key 的數據輸出到這個文件夾中,後面跟着一個「/」 表明是當前目錄下,當前目錄指的確定不是項目的當前目錄,他是在執行hadoop jar 時傳遞的輸出目錄的參數,如:hadoop jar test.jar com.TestJob /input /output     orm

假設數據是這樣的:
1    麗梅
1    小輝
2
    小紅
3    大華 ip

那麼將輸出三個文件夾分別爲
/output/1
/output/2
/output/3
其中/output/1這個文件夾中一個文件,內容爲 hadoop

1    麗梅
1    小輝
get

write函數還有其餘方法,暫時尚未研究,並且針對於write方法的第一個函數也沒有去研究,若是有時間,會把多文件輸出詳細總結一下

注:在配置job的時候

這句代碼

MultipleOutputs.addNamedOutput(job, "errorlog",
    TextOutputFormat.class, Text.class, NullWritable.class);



就寫一次就夠了
相關文章
相關標籤/搜索