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

前面介紹過通過Phoenix操作HBase,實現了hbase的SQL語義,以及查詢性能的提升,也對比過使用hive查hbase和使用phoenix查hbase的性能,也介紹瞭如何在hive中查詢ES,那麼今天我們就嘗試在hive中查phoenix。也就是hbase-->Phoenix-->hive這樣的鏈路。

相關內容:

CDH5.14集羣下Phoenix4.14.0安裝及性能對比phoenix/impala/hive

CDH6.2中使用parcel離線安裝Phoenix5.0.0

使用Phoenix映射hbase表創建表和視圖

ELK系列(十三)、在Hive中操作ES的索引數據,創建/查詢/更新/插入

-------------------------------在hive中操作Phoenix表--------------------------------------

環境

CDH-6.3.1
Hive-2.1.1
Phoenix-5.0.0
Hbase-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端是否同步了該數據:

--hbase
scan "PHOENIX_HIVE_CREATE_INTERNAL"

--phoenix
select * from "PHOENIX_HIVE_CREATE_INTERNAL";

從Phoenix插入數據,在hive端查看

--phoenix端 插入一條數據
upsert into "PHOENIX_HIVE_CREATE_INTERNAL" values('csdn',2,8.66,7.555);

select * from "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 delete
update 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。

 

希望本文對你有幫助,請點個贊鼓勵一下作者吧~ 謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章