2013-11-04 45 views
1

考慮在地圖-減少作業的以下主要類:命令'hadoop jar'不需要-Dfile.encoding = UTF-8?

public class App extends Configured implements Tool { 

    public static void main(String[] args) throws Exception { 
     ToolRunner.run(new App(), args); 
    } 

    @Override 
    public int run(String[] args) throws Exception { 
     System.out.println(Charset.defaultCharset().toString()); 
     return 0; 
    } 

} 

當在交互式外殼使用時,它輸出「UTF-8」。在crontab中使用時,它是'US-ASCII'。

但是使用'java -Dfile.encoding = UTF-8 -jar xxx.jar',它在crontab中工作正常。但是,'hadoop jar'命令不採用此參數:

hadoop jar xxx.jar -Dfile.encoding=UTF-8 

在crontab中,它仍然輸出US-ASCII。

一種解決方案是導出LC_ALL ENV:

0 * * * * (export LC_ALL=en_US.UTF-8; hadoop jar xxx.jar) 

有另一種方式?

更新

另一個ENV我找到有用的是HADOOP_OPTS:

0 * * * * (export HADOOP_OPTS="-Dfile.encoding=UTF-8"; hadoop jar xxx.jar) 

回答

0

試試設置環境變量HADOOP_OPTS包含這樣ARGS。他們真的是java的理由。請參閱bin/hadoop腳本;它會將這些添加到java命令中。

+1

您剛剛根據我的更新和評論更改了您的答案。在你之前的回答中,你建議「hadoop -D ... jar」,你甚至不會測試它。我認爲這不是一件優雅的事情。 –

+0

我不明白。你是對的,我以前的回答是錯誤的。 (如果你通過'java'調用Hadoop客戶端,它就會起作用,但這不是你要求的。)所以我發佈了一個可以工作的新答案。這裏有什麼問題@Jerry? –

+0

在你回答之前進行測試,這就是我所要求的。 –

0

我們發現問題在於映射程序java進程沒有-Dfile.encoding = UTF-8。我們必須將其添加到「mapreduce.map.java.opts」。 「mapreduce.reduce.java.opts」也一樣。

你可以做到這一點的XML配置文件,以及在Java中,如:

config.set("mapreduce.map.java.opts","-Xmx1843M -Dfile.encoding=UTF-8"); 

的配置詳情,請參閱http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/ClusterSetup.html