2013-03-17 47 views
0

突然多個輸出不會將任何輸出寫入目標。多個輸出突然不寫任何輸出?

我使用多個輸出,其中,我只是改變的自定義實現:

if((ch == '/') || (ch == ':')||(ch == '-')||(ch =='.')) 
     { 
      continue; 
     } 
在該方法中

,如下所示。但是一直在工作,突然它不工作。它不寫任何東西到輸出目錄:

/家庭/用戶/ mlakshm/

請幫助!

private static void checkTokenName(String namedOutput) { 
    if (namedOutput == null || namedOutput.length() == 0) { 
     throw new IllegalArgumentException(
     "Name cannot be NULL or emtpy"); 
    } 
    for (char ch : namedOutput.toCharArray()) { 
     if ((ch >= 'A') && (ch <= 'Z')) { 
     continue; 
     } 
     if ((ch >= 'a') && (ch <= 'z')) { 
     continue; 
     } 
     if ((ch >= '0') && (ch <= '9')) { 
     continue; 
     } 
     if((ch == '/') || (ch == ':')||(ch == '-')||(ch =='.')) 
     { 
      continue; 
     } 
     throw new IllegalArgumentException(
     "Name cannot be have a '" + ch + "' char"); 
    } 
    } 
+1

你到底在哪裏寫輸出到那個目錄? – Jeffrey 2013-03-17 14:52:16

+0

恩,你是否得到例外? – 2013-03-17 14:52:19

+0

我沒有得到任何異常。但是什麼都沒有寫 – 2013-03-17 14:53:23

回答

0

正如您可能注意到方法checkTokenName()是爲了確保輸出名稱是有效的。現在,您正試圖修改MultipleOutputs的不可分割的部分,您不應該這樣做。有許多的原因,字符,例如/:.-沒有在第一時間允許的:

  1. 許多文件系統不允許某些字符的文件名
  2. 使用MultipleOutputs,可以寫入多個文件,但是在指定的目錄中,不在任何所需的位置。
  3. 正如你可能已經注意到,一個名爲如下輸出:

    //定義作業 MultipleOutputs.addNamedOutput另外一個基於文本輸出「文本」(工作,「文本」,TextOutputFormat.class, LongWritable.class,Text.class); 輸出文件名應爲文本-0000,text0001等

所以,如果你想在不同的目錄來寫的話,最好去重寫MultipleTextOutputFormat;如果你不能使用舊API,那麼你最好自己寫信給HDFS/S3而不是依靠hadoop來做到這一點。

+0

感謝您的回答..準則非常有用多輸出工作正常我在configure方法中犯了一個錯誤,它讀取通過分佈式緩存使用多個輸出寫入的文件。我使用configure(conf,reprter)而不是configure(conf),所以程序從未進入配置方法,沒有文件被讀取,我誤以爲沒有文件是w ritten由多個輸出。 – 2013-03-20 19:43:24