2012-05-03 110 views
0

我正在運行Hadoop mapreduce流式作業(僅適用於mappers工作)。在某些情況下,我的作業寫入標準輸出,從而創建一個非零大小的輸出文件。在某些情況下,我的作業不會向stdout寫入任何內容,但仍會創建大小爲零的輸出文件。有沒有辦法避免在沒有任何內容寫入標準輸出時創建這個大小爲零的文件。輸出文件大小爲零

+0

我不這麼認爲。 –

回答

0

如果您不介意擴展您當前的輸出格式,則只需要覆蓋OutputCommitter以在沒有數據寫入時「中止」commitTask階段。

請注意,並非所有輸出格式都顯示空文件的零文件字節(例如,序列文件具有標題),因此您不能只檢查輸出文件大小。

看看源下列文件:

  • OutputCommitter - 基抽象類
  • FileOutputCommitter - 大多數FileOutputFormats使用的提交者所以這是一個良好的開端。看看私有方法moveTaskOutputs,這是你的邏輯將最有可能去(不要複製的文件,如果沒有寫入)
0

是否使用MultipleOutputs? 如果是,則即使Reducer沒有任何內容寫入輸出,MultipleOutputs也會創建默認文件。 爲了避免這種默認零大小的輸出,你可以使用LazyOutputFormat.setOutputFormatClass()

從我的經驗,即使您正在使用LazyOutputFormat,創建零大小的文件時:減速機有一定的數據寫入(因此創建輸出文件)但在編寫輸出之前還原器會死亡。我相信這是一個計時問題,所以你可能會發現HDFS中只存在部分縮減器輸出文件,或者你可能根本沒有注意到這一點。

例如。如果您有10個reducer,則可能只有'n'(n < = 10)個文件,其中一些文件大小等於0個字節。