Hive中操作Phoenix,對比Hive查詢Hbase

今天我們嘗試在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,對比Hive查詢Hbase

在hive中建完Phoenix內表之後可以看到在phoenix中和hbase中都自動建立了一張表PHOENIX_HIVE_CREATE_INTERNAL。

Hive中操作Phoenix,對比Hive查詢Hbase
從hive往phoenix插入資料

不支援spark引擎:

Hive中操作Phoenix,對比Hive查詢Hbase
--修改執行引擎set hive.execution.engine=mr; --在hive中插入一條記錄insert into default.phoenix_hive_create_internal values('wyk',1,2.3412,3.14);
Hive中操作Phoenix,對比Hive查詢Hbase

檢視hbase和phoenix端是否同步了該資料:

--hive端驗證能否看到phoenix端插入的記錄select * from default.phoenix_hive_create_internal ;
Hive中操作Phoenix,對比Hive查詢Hbase
從Phoenix插入資料,在hive端檢視
--hive端驗證能否看到phoenix端插入的記錄select * from default.phoenix_hive_create_internal ;
Hive中操作Phoenix,對比Hive查詢Hbase
--hive端驗證能否看到phoenix端插入的記錄select * from default.phoenix_hive_create_internal ;
Hive中操作Phoenix,對比Hive查詢Hbase
在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,對比Hive查詢Hbase
Hive中操作Phoenix,對比Hive查詢Hbase
Hive中操作Phoenix,對比Hive查詢Hbase

如果在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
Hive中操作Phoenix,對比Hive查詢Hbase

對比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。

版權宣告:本文源自 網路, 於,由 楠木軒 整理釋出,共 3204 字。

轉載請註明: Hive中操作Phoenix,對比Hive查詢Hbase - 楠木軒