今天我們嘗試在hive中查phoenix。也就是hbase-->Phoenix-->hive這樣的鏈路。
環境CDH-6.3.1Hive-2.1.1Phoenix-5.0.0Hbase-2.1.0 hive整合phoenix僅支援hive使用mapreduce,tez引擎,不支援spark引擎;如果啟用了kerberos,需要使用同時有hive和hbase許可權的使用者;
依賴
需要在hive中新增phoenix的jar包依賴,下面的命令是在hive命令列裡session級別生效的,如果想全域性生效可參考上面的hive操作ES的文章裡的內容。phoenix-version-hive.jar包可以在$PHOENIX_HOME/lib下找到。
add jar /home/tools/wyk/phoenix-5.0.0-cdh6.2.0-hive.jar;
驗證在hive中建phoenix內表在hive中建立Phoenix內部表,hive會管理結構和資料,會自動在phoenix建表,刪除hive表的時候對應的Phoenix表也刪除。
-- 在hive中建立Phoenix內部表,hive會管理結構和資料,會自動在phoenix建表,刪除hive表的時候對應的Phoenix表也刪除:create table default.phoenix_hive_create_internal (s1 string,i1 int,f1 float,d1 double)STORED BY 'org.apache.phoenix.hive.PhoenixStorageHandler'TBLPROPERTIES ("phoenix.table.name" = "phoenix_hive_create_internal","phoenix.zookeeper.quorum" = "uathd01,uathd02,uathd03","phoenix.zookeeper.znode.parent" = "/hbase","phoenix.zookeeper.client.port" = "2181","phoenix.rowkeys" = "s1, i1","phoenix.column.mapping" = "s1:s1, i1:i1, f1:f1, d1:d1","phoenix.table.options" = "SALT_BUCKETS=10, DATA_BLOCK_ENCODING='DIFF'");
在hive中建完Phoenix內表之後可以看到在phoenix中和hbase中都自動建立了一張表PHOENIX_HIVE_CREATE_INTERNAL。
從hive往phoenix插入資料不支援spark引擎:
--修改執行引擎set hive.execution.engine=mr; --在hive中插入一條記錄insert into default.phoenix_hive_create_internal values('wyk',1,2.3412,3.14);
檢視hbase和phoenix端是否同步了該資料:
--hive端驗證能否看到phoenix端插入的記錄select * from default.phoenix_hive_create_internal ;
從Phoenix插入資料,在hive端檢視--hive端驗證能否看到phoenix端插入的記錄select * from default.phoenix_hive_create_internal ;
--hive端驗證能否看到phoenix端插入的記錄select * from default.phoenix_hive_create_internal ;
在Hive中對Phoenix的資料進行更新官方文件上說不支援在hive中對phoenix表進行update和delete操作,但是我們可以執行insert命令,只要主鍵與phoenix表的相同就會自動更新。
例:--準備一條記錄用做更新insert into default.phoenix_hive_create_internal values('csdn',3,0.222,0.1114); --再次插入一條記錄,主鍵與phoenix的相同,這裡的是s1和i1組合鍵,更新f1欄位insert into default.phoenix_hive_create_internal values('csdn',3,0.888,0.1114);
如果在hive中對phoenix表執行update或delete 命令會報下面的錯誤:
--不支援update deleteupdate default.phoenix_hive_create_internal set f1=0.888 where i1=3;delete from default.phoenix_hive_create_internal where i1=3;FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.
"Hive on Phoenix" VS "Hive on Hbase"
hive讀phoenix和hive讀hbase的效能對比:
首先在hive中建一個hbase外表,然後建一個phoenix外表,將hive表的資料同時寫入hbase表和phoenix表,然後對比在hive中查詢hbase和phoenix的效能。
hive建hbase外表和phoenix外表以及資料準備的步驟先略過了,在之前的文章和本篇上面已經有過示例程式碼,我們直接看錶:
Hive shell--hive表select count(1) from tbl_doc_record; result: 565343--hbase外表select count(1) from default.hbase_tbl_doc_record; result: 565343 --phoenix外表select count(1) from default.phoenix_tbl_doc_record;result: 565343
對比phoenix客戶端查出來的結果一致都是565343條記錄:
嘗試了幾個SQL,使用hive查詢phoenix和hbase的效能幾乎一致,直接在phoenix裡查詢效能遠超在impala中查詢hive表。很奇怪為什麼使用hive查詢phoenix就慢了呢,下面根據Phoenix上的方式修改配置。
提升Hive查詢Phoenix的效能:
按官方的說法,設定下面兩個引數後,在Hive shell中對phoenix表的查詢速度跟在phoenix client中查詢一樣,但嘗試之後發現在hive中查詢phoenix表的速度跟查hbase表差不多,就是很慢,但是在phoenix client查剛才從hive建的表就很快,嘗試修改了好幾個引數都沒能成功,希望有小夥伴嘗試成功了能跟我同步一下,謝謝。
Hive Shell:set hive.exec.parallel=true;set hive.fetch.task.conversion=more ;
當前版本的限制- 暫不支援在Hive中對Phoenix表進行更新update和刪除delete。但是可以透過insert的時候主鍵相同會實現更新操作,和hive操作ES類似。
- 欄位對映不到rowkey列。
- mapreduce和tez引擎僅支援一個reducer。