考虑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)
答案 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。