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