hive是EMR集群常用的数据分析工具。执行hive命令时,我们经常会遇到各种错误,不知道该怎么解决。
本文是hive异常排查系列的第一篇,主要介绍常见的hive执行异常和定位方法,以及hive日志位置。
一.常见异常表现
主要是执行hive sql的卡住,提示异常。如执行sql直接提示异常信息,执行sql卡住,显示mapreduce进度一直0%,mapreduce进度不动了,执行一半提示异常退出,等等。
二.异常定位
2.1.执行sql直接提示异常信息
一般是语法问题或hive服务异常。
2.1.1 ParseException,语法解析错误,sql写的有问题。如
hive> show table;
FAILED: ParseException line 1:10 mismatched input '<EOF>' expecting EXTENDED near 'table' in show statement
提示table语法错误,应该是show tables。
hive> select * from test;
FAILED: SemanticException [Error 10001]: Line 1:14 Table not found 'test'表test不存在。2.1.2.MetaException,一般是metastore有问题。如
hive> show tables;
FAILED: SemanticException MetaException(message:Could not connect to meta store using any of the URIs provided. Most recent failure: org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused (Connection refused)连不上metastore,说明metastore服务有问题,如oom,被操作系统kill,等。
2.2.执行卡住
要看hive日志分析原因,一般是hive客户端遇到某种可重试异常一直在重试。
遇到过一次,看hive客户端日志反复有报错提示说不能识别一个机器域名。确定问题是因为hive on tez,hive client要用【集群内域名:端口】方式访问tez作业的appmaster,而执行hive命令的服务器没有配置集群内域名的解析,所以无法识别该域名。在/etc/hosts下增加域名配置解决该问题。
2.3.mapreduce进度一直0%
一般是作业没有资源,导致状态一直peding。可以打开yarn ui,查看该hive作业是不是一直在peding。peding可能是已有hadoop作业太多集群没资源了,也有可能是sql提交的hadoop资源池队列没有资源了。等待或者杀掉其他作业。
2.4. mapreduce进度不动了
有可能有死锁。常见场景是yarn资源池队列资源有限,提交了好多作业。各作业appmaster,reduce占用光了资源,没资源继续执行了,死锁。解决方案是避免reduce提前启动占用资源,设置reduce在map都执行完再启动。修改maped-site.xml的mapreduce.job.reduce.slowstart.completedmaps参数,改为0.98,或者1。这样只有98%的map或100%的map都执行完,再启动reduce。
2.5. 执行一半异常退出
常见map/reduce oom。查看作业运行日志,以及yarn ui查看sql任务的map,reduce日志,是否有oom信息。解决方法是在执行sql前,通过set 修改map,reduce的内存来避免oom。其他还有一些造成oom的原因,下一篇文章重点介绍。
三.hive日志位置
hive日志默认是 /tmp/[user]下。由于tmp目录重启后清空,在EMR集群里,hiveserver和metastore的日志在进程启动时做了额外的参数配置,日志在/var/log/hive/目录,hiveserver2.log和 metastore.log。 滚动每天生成一个新文件。
hive client的日志依然在 /tmp/[user]下,hive.log。root用户就在/tmp/root/hive.log下。
hive的mapreduce作业日志跟其他hadoop作业的mapreduce位置一样,再集群各个节点上,通过yarn ui查看。