记一个信创ARM环境上的Hive时区问题
问题现象
今天,运维同事发现最近一段时间Hive查询出来的结果,跟时间相关的字段值,时间都相差1个小时,似乎是用到了夏令时区,因为时间在3月10之前的显示都正常,3月10日之后,时间都不正确;
问题分析
1、检查Hive在HDFS上的原始数据,使用“hive --orcfiledump -d”命令,文件中的时间戳是正确的;现场松了一口气,因为数据是正确的,只是查询显示不正确;
2、在开发测试环境上运行的结果都是正确的,HDP内核代码应该没有问题,把焦点放在了时区上;
3、Hive默认用的引擎是tez,在环境上把引擎修改为spark后,执行结果也是正确的;
4、问题应该是在tez上,比对了一下生产环境和测试环境的参数,发现hive.tez.java.opts参数中,生产环境设置了 -Duser.timezone=CST,而测试环境没有设置
网上查了一下CST时区,发现它是个大坑,代表了4个时区。将这个参数去掉或者设置为Asia/Shanghai后,Hive的查询结果都正确。
CST可视为美国、澳大利亚、古巴或中国的标准时间。 CST可以为如下4个不同的时区的缩写: 美国中部时间:Central Standard Time (USA) UT-6:00 澳大利亚中部时间:Central Standard Time (Australia) UT+9:30 中国标准时间:China Standard Time UT+8:00 古巴标准时间:Cuba Standard Time UT-4:00 |
问题结论
hive.tez.java.opts中不应该设置 -Duser.timezone=CST,不设置的话就使用的服务器时区
当初信创环境设置了CST时区是因为从X86切换过来时,Hive参数都保留了原样,而切换到信创时是在3月10日之前,还没进入夏令时,所以当时没有出现这个问题。
X86环境也没有这个问题,应该是X86环境将CST识别是中国标准时区;而在华为信创环境CST被识别成了其他的时区。
以后千万不能再使用CST时区
- 点赞
- 收藏
- 关注作者
评论(0)