命令'hadoop jar'不带-Dfile.encoding = UTF-8?

时间:2013-11-04 08:57:44

标签: hadoop

考虑map-reduce作业的以下主要类:

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;
    }

}

在交互式shell中使用时,它会输出“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)

还有其他办法吗?

更新

我发现另一个有用的环境是HADOOP_OPTS:

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

2 个答案:

答案 0 :(得分:0)

尝试将环境变量HADOOP_OPTS设置为包含这样的args。它们确实是java的论据。请参阅bin/hadoop脚本;它会将这些添加到java命令。

答案 1 :(得分: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