阐述一下背景:
我曾经写的一个jar的任务,是用spark去处理hive数据;已经在若干个服务器上调度都是很正常的,但是有一天在3个场地爆出,运行失败的问题;然后自己就去看日志追问题,在日志上看到到了中文乱码。所以基本锁定是编码问题。因为的任务里面有一个验证环节:1.任务本地存储一个json配置文件;2.spark拉取分布式数据的统计信息;3.如果1中的key在2中则进行跑数;
问题判定:
日志显示,验证环节失败了。所以可以肯定的是,不是spark读的数据是乱码,就是我的本地配置读的时候是乱码。
问题排查:
1.我写死了一个spark的hiveSQL,即不用本地配置读的key,然后去跑数,发现正常;
2.所以我们可以锁定问题出在了java在读本地配置的时候,配置是乱码了。
3.乱码的特点,部分中文乱码,数字和字母没问题;
问题断定:
原因:通过上述的排查,基本可定,java在读取的配置的时候,编码形式肯定有问题,导致中文乱码。
代码位置:
代码里面读配置的程序如下:
reader = new BufferedReader(new FileReader(file));
所以,一步一步发现原来是FileReader的问题;
乱码分析:
FileReader内部没有设置指定编码的参数,只能使用ISO-8859-1 or US-ASCII的西方编码。所以问题找到了就是这里。
替换方案:
InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(filePath)), “UTF-8”);
BufferedReader br = new BufferedReader(isr);
扩展:
我发现既然读有问题,是不是写也有问题,因为我的写用了FileWriter,测试一下,咦果然也有问题;
所以FileWriter写的部分需要替换成,如下:
BufferedWriter writer = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (filePath,true),“UTF-8”));
参考资料:
Java FileWriter无法编码utf-8 转换方法
https://blog.youkuaiyun.com/liyuxing6639801/article/details/69487712
FileReader读取中文字符乱码问题
https://blog.youkuaiyun.com/wjw521wjw521/article/details/72831704
JAVA基础知识之InputStreamReader流
https://blog.youkuaiyun.com/ai_bao_zi/article/details/81133476