在很多程序中,我们都可以通过输出日志的形式来得到程序运行情况,通过这些输出日志来调试程序,Hive也不例外。在Hive中,使用的是Log4j来输出日志,默认情况下,CLI是不能将日志信息输出到控制台的。在Hive0.13.0之前的版本,默认的日志级别是WARN,在Hive0.13.0开始,默认的日志级别是INFO。默认的日志存放在/tmp/<user.name>文件夹的hive.log文件中,全路径就是/tmp/<user.name>/hive.log。
注:这里有一个的bug,在本地模式下,log文件名为".log",而不是"hive.log",可以在这里看到https://issues.apache.org/jira/browse/HIVE-5528,这个bug将会在Hive0.13.0中得到解决。
在默认的日志级别情况下,是不能将DEBUG信息输出,这样一来出现的各种详细的错误信息都是不能查看到的。但是我们可以通过以下两种方式修改log4j输出的日志级别,从而修改log4j输出的日志级别,从而利用这些调试日志进行错误定位,具体做法如下:
[wyp@master ~]$ hive --hiveconf hive.root.logger=DEBUG,console
hive.root.logger=DEBUG,console
另外还有一点就是上一篇文章Hive几种参数配置的方法中提到的,有一些系统级的参数,在HQL中设定是无效的。这里就是一个很好的例子。因为设定Log的参数读取会在会话建立以前完成。这也就是说,我们不能通过下面的方法来修改log4j的日志输出级别:
hive> set hiveconf:hive.root.logger=DEBUG,console;
[wyp@master /home/q/hive-0.11.0-bin/conf]$ hive ................................为了篇幅,省略了很多............................ 13/12/25 15:14:54 DEBUG parse.VariableSubstitution: Substitution is on: hive ................................为了篇幅,省略了很多............................ 13/12/25 15:14:54 DEBUG security.Groups: Creating new Groups object 13/12/25 15:14:54 DEBUG util.NativeCodeLoader: Trying to load the c... library for your platform... using builtin-java classes where applicable 13/12/25 15:14:54 DEBUG security.JniBasedUnixGroupsMappingWithFallback: Falling back to shell based 13/12/25 15:14:54 DEBUG security.JniBasedUnixGroupsMappingWithFallback: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping 13/12/25 15:14:54 DEBUG security.UserGroupInformation: hadoop login 13/12/25 15:14:54 DEBUG security.UserGroupInformation: using local user:UnixPrincipal: wyp 13/12/25 15:14:54 DEBUG security.UserGroupInformation: UGI loginUser:wyp (auth:SIMPLE) ................................为了篇幅,省略了很多............................
hive> show tables; FAILED: Error in metadata: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask hive>得到上面的错误,我们从上面的错误输出只知道是元数据有问题,具体的错误也不知道是啥,这时候如果我们修改日志调试级别hive.root.logger=DEBUG,console,我们再看看运行上面语句的错误输出:
hive> show tables; ................................为了篇幅,省略了很多............................ 13/12/25 15:23:58 INFO metastore.ObjectStore: ObjectStore, initialize called 13/12/25 15:23:58 ERROR Datastore.Schema: Failed initialising database. Access denied for user 'datalog5'@'l-datalog5.data.cn1' (using password: YES) org.datanucleus.exceptions.NucleusDataStoreException: Access denied for user 'datalog5'@'l-datalog5.data.cn1' (using password: YES) at org.datanucleus.store.rdbms.ConnectionFactoryImpl $ManagedConnectionImpl.getConnection(ConnectionFactoryImpl.java:536) at org.datanucleus.store.rdbms.RDBMSStoreManager.<init> (RDBMSStoreManager.java:290) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ................................为了篇幅,省略了很多............................
通过上面的错误堆栈我们就可以将问题定位到数据库连接的问题上,这么一来错误的定位范围就大大减少了,我们可以查看hive-site.xml文件中的数据库连接配置是否正确,从而解决问题。
文章来自过往记忆:http://www.iteblog.com/archives/873