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