最近使用hue 查询hive 出现超时,sql提交无反应。cdh监控发现HS2连接数直线上升,cpu使用率升高一直占用cpu,如下图:
使用netstat命令查看端口连接状态,发现端口出现大量FIN_WAIT2的状态,重启hive后恢复正常。开始怀疑是网络丢包问题,检查服务器上其它进程正常,隔段时间问题重新,怀疑是hive服务本身卡死,端口状态如图:
jstack打印程序堆栈信息,发现hive工作线程全部堵塞,等待锁,堆栈如下:
从堆栈可以看出hive都卡在编译上,都在等待一条正在编译的sql释放锁,而正在编译的sql一直在编译没有释放锁,线程卡死。从hive日志中将出问题这段时间的sql找出来进行测试执行,找到了一条sql,只要一跑hive就会卡死,出现上面的问题。这条sql select * from xxx limit 10 。查看这张表的信息:分区表,分区数据有三年的数据,表字段特别多有3000多个字段。将sql 指定分区及字段正常运行。
总结: hive 表分区及字段太多超过上千字段会导致hive sql编译线程卡死,导致hive异常。写sql 时必须指定分区,字段,裁剪掉不必要的字段及分区。