命令'hadoop jar'不采用 -dfile.encoding=UTF-8?



考虑以下用于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;
    }
}

在交互式外壳中使用时,它会输出"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环境:

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)

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

我们发现问题在于映射器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。

最新更新