1

考虑以下用于 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 环境:

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)
4

2 回答 2

0

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

于 2013-11-04T10:29:11.777 回答
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

于 2015-05-08T16:57:39.280 回答