一句話總結:連不上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
