1. 程式人生 > >hive啟動MetaStore報錯解決方案

hive啟動MetaStore報錯解決方案

今天在自己的虛擬機器上安裝apache-hive-3.1.1時啟動hive時出現了很多錯誤,經過不斷的資料查詢及測試最終可以正常運行了,特記錄下,加深自己的印象分享給大家,也以便以後出現同樣的錯誤時可以檢視筆記解決。

第一條錯誤:

MetaException(message:Error creating transactional connection factory)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:84)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:93)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:8661)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:8656)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.startMetaStore(HiveMetaStore.java:8926)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.main(HiveMetaStore.java:8843)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
	at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: MetaException(message:Error creating transactional connection factory)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.invokeInternal(RetryingHMSHandler.java:208)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.invoke(RetryingHMSHandler.java:108)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:80)
	... 11 more

原因:${HIVE_HOME}/lib目錄下沒有找到mysql-connector的jar包,因為我配置的源資料是MySQL資料庫,然後把mysql-connector-java-5.1.27-bin.jar下載放到${HIVE_HOME}/lib目錄下再次啟動。發現報錯如下:

MetaException(message:Hive Schema version 3.1.0 does not match metastore's schema version 1.2.0 Metastore is not upgraded or corrupt)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:84)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:93)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:8661)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:8656)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.startMetaStore(HiveMetaStore.java:8926)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.main(HiveMetaStore.java:8843)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
	at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

原因:MySQL中的MetaStore資料庫中儲存的源資料版本和現在用的hive版本不匹配(我以前安裝了apache-hive-1.2.1版本,然後配置檔案拷貝以前的,忘記改hive-site.xml配置檔案中javax.jdo.option.ConnectionURL屬性的值,此屬性是指定MetaStore連線地址及資料庫的,將其設定成MySQL的連線地址及指定資料庫就OK)

如果你只有一個hive版本,可以有以下兩種解決方案:
1.登陸mysql,修改hive metastore版本:

進行mysql:mysql -uroot -p 123456
use hive; -- 配置檔案中javax.jdo.option.ConnectionURL屬性值指定的資料庫名稱
select * from version; update VERSION set SCHEMA_VERSION='3.1.1' where VER_ID=1;

2.簡單粗暴:在hvie-site.xml中關閉版本驗證

<property>
	<name>hive.metastore.schema.verification</name>
	<value>false</value>
</property>

我按照上面將javax.jdo.option.ConnectionURL的屬性值改成另外一個數據庫後啟動MetaStore發現報錯如下(MySQL資料庫沒有沒有):

MetaException(message:Version information not found in metastore.)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:84)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:93)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:8661)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:8656)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.startMetaStore(HiveMetaStore.java:8926)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.main(HiveMetaStore.java:8843)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
	at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

解決方案:將下列兩個屬性設定為false

<property>
	<name>datanucleus.metadata.validate</name>
	<value>false</value>
</property>
<property>
	<name>hive.metastore.schema.verification</name>
	<value>false</value>
</property>

接下來報錯:

MetaException(message:Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. Either your MetaData is incorrect, or you need to enable "datanucleus.schema.autoCreateTables")
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:84)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:93)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:8661)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:8656)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.startMetaStore(HiveMetaStore.java:8926)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.main(HiveMetaStore.java:8843)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
	at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

因為在此實驗環境中,hive的元資料儲存在遠端的mysql中,所以該錯誤意思是:在遠端的資料庫中沒有找到相應的資料物件。

解決辦法:將下列屬性設定為true

<property>
	<name>datanucleus.schema.autoCreateAll</name>
	<value>true</value>
</property>

這個屬性的含義是:當元資料庫中必要的資料物件不存在是,會自動建立。

最後提醒:在xml配置檔案中,在標籤之間不要有空格!!!因為讀取xml檔案時是按標籤讀取的。