Hive從0.14版本開始支持事務和行級更新,但缺省是不支持的,需要一些附加的配置。要想支持行級insert、update、delete,需要配置Hive支持事務。(行級的insert好像不配置也能運行)
1、修改hive-site.xml,添加如下語句:
<property> <name>hive.support.concurrency</name> <value>true</value> </property> <property> <name>hive.exec.dynamic.partition.mode</name> <value>nonstrict</value> </property> <property> <name>hive.txn.manager</name> <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value> </property> <property> <name>hive.compactor.initiator.on</name> <value>true</value> </property> <property> <name>hive.compactor.worker.threads</name> <value>1</value> </property>
2、修改hive-site.xml 后,執行更新語句,報錯 FAILED: Error in acquiring locks: Error communicating with the metastore
網上查找,說要添加Hive元數據
INSERT INTO NEXT_LOCK_ID VALUES(1); INSERT INTO NEXT_COMPACTION_QUEUE_ID VALUES(1); INSERT INTO NEXT_TXN_ID VALUES(1); COMMIT;
但是mysql中以上三個表根本不存在。傻傻的手動在mysql建了這三個表,列名都取為id。還是報錯。看來只能從源頭查找為什么hive自己沒有建立這幾個表。
3、在mysql服務器上用wireshark抓包 ,發現是在執行sql語句時出的錯誤。再看出錯時對應的sql語句,是在操作HIVE_LOCKS表,顯示這個表也未創建。所以沒有建立的表不止上面三個。
4、hive相關的表(schema)都應該是不存在時自動創建才對,百度之。找到hive創建schema的腳本是scripts/metastore/upgrade/mysql/hive-schema-2.1.0.mysql.sql。
但是這個腳本文件中並沒有找到HIVE_LOCKS表的創建語句,在該目錄下grep HIVE_LOCKS ./ -R,發現創建的語句寫在hive-txn-schema-2.1.0.mysql.sql。
5、查看hive-schema-2.1.0.mysql.sql文件,發現是通過"SOURCE hive-txn-schema-2.1.0.mysql.sq"來加入執行的。網查說是hive元數據庫沒有初始化。可以通過
schematool -dbType mysql -initSchema
來初始化所有schema,執行以上語句后,有報錯,表還是沒創建。於是手動執行
hive -f hive-txn-schema-2.1.0.mysql.sql
相應的表創建成功之后,再測試就可以了。(將hive-site.xml中的元數據庫換了一個,重新新建了一個mysql元數據庫,在執行 schematool -dbType mysql -initSchema 時竟然沒有報錯,那些表也都有了)
現在遺留的問題:
1. hive-schema-2.1.0.mysql.sql中SOURCE為什么沒生效?
網上說是沒有絕對路徑當然找不到無法執行(如果試圖手動改成絕對路徑重新執行的話,因為其他的sql語句里有一些insert,就會報一些Duplicate key name,Duplicate entry等錯誤...而且txn那個文件里建表不檢查是否exists,多執行幾遍又會報表已經存在錯誤..
使用schemetool就可以避免這些麻煩,而且很明確的知道是否初始化成功.)...。
可是配置里不帶絕對路徑肯定是通常情況都可以執行的啊
2. 執行hive -f hive-txn-schema-2.1.0.mysql.sql時,為什么表就建立在mysql中了,而不是hive本地文件系統 。
3、 schematool -dbType mysql -initSchema 這個到底干了嘛?
參考:
http://www.bubuko.com/infodetail-1834078.html
http://blog.csdn.net/wzy0623/article/details/51483674
http://blog.csdn.net/zxc2zxc120/article/details/40543589
新問題:
hive (zqhdb)> delete from id_test where id=4; FAILED: SemanticException [Error 10297]: Attempt to do update or delete on table zqhdb.id_test that does not use an AcidOutputFormat or is not bucketed