一句话总结:连不上Hive的元数据库(Meta Store)所致。需要查看hive.log确定问题原因。我的问题是HADOOP_CONF_DIR下的hive-site.xml中元数据库地址配置错误所致。因为Hive会默认先读取HADOOP_CONF_DIR下的hive-site.xml而非自身conf目录下的hive-site.xml。
解决过程:
从别的机器上复制了hive和hadoop过来,修改了所有配置,但发现还是不能正常使用hive。可以通过bin/hive命令正常启动Hive CLI,但是一旦输入命令show databases;就会报错:
hive (default)> show databases;
FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
通过查看日志tmp/${user.name}/hive.log,发觉如下语句:
2017-08-27 23:13:13,352 ERROR [main]: Datastore.Schema (Log4JLogger.java:error(125)) - Failed initialising database.
Unable to open a test connection to the given database. JDBC url = jdbc:mysql://Jing3.zhu/hive?createDatabaseIfNotExist=true, username = root. Terminating connection pool (set lazyInit to true if you expect to start your database after your app). Original Exception: ------
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
看到了jdbc:mysql://Jing3.zhu,而我元数据库(metastore)的位置现在已迁移到了Jing6.zhu!
于是再次检查hive-site.xml,但是hive-site.xml显示:
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://Jing6.zhu/hive?createDatabaseIfNotExist=true</value>
明明指向的是Jing6.zhu啊!
后来终于想起来,当初为了用sqoop,因为sqoop找不到hive的的配置文件,曾今把hive-site.xml文件复制到$HADOOP_CONF_DIR目录下,即$HADOOP_HOME/etc/hadoop,而这个hive-site.xml并未修改元数据库地址!
而Hive会优先读取$HADOOP_CONF_DIR下的配置文件!!
所以这也导致了我配置的hive-log4j.properties失效,Hive CLI启动时,提示使用的还是/hive-1.1.0-cdh5.7.6/lib/hive-common-1.1.0-cdh5.7.6.jar中hive-log4j.properties!因为我没有把hive-log4j.properties一起复制到$HADOOP_CONF_DIR!
最后经Stack Overflow上高人指点,告诉我复制hive-site.xml之类的配置文件是一个很不好的方法,最好是直接建立link,或者使用Cloudera Manager管理设置文件更佳!
StackOverflow原帖:https://stackoverflow.com/questions/45906680/why-hive-will-search-its-configuration-profile-in-hadoop-conf-dir-first