楠木軒

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內表之後可以看到在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。