当前位置:网站首页>基於CM管理的CDH集群集成Phoenix

基於CM管理的CDH集群集成Phoenix

2022-04-23 14:03:00 百夜﹍悠ゼ

基於CM管理的CDH集群集成Phoenix

背景介紹:原有的CDH集群,以Hive+Hbase+Impala進行數據處理查詢,Hbase而言語法難懂,不同於尋常的SQL,Impala而言速度查詢速度太慢且無法進行記錄的修改。故而考慮用Phoenix來集成Hbase、Hive以解决上述問題。

前提:已經基於CM安裝搭建CDH集群,本文采用parcels包的方式集成Phoenix到CDH集群。

下載Phoenix Parcel包和Jar包並上傳到CM-Server節點

本文采用的phoenix版本包如下:

# Parcel包
manifest.json
PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel
PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel.sha1
# Jar包
PHOENIX-1.0.jar

(1)修改.sha1文件為.sha,即去掉後綴1。將phoenix的parcel包和jar包上傳到cloudera manager server節點的httpd服務下/var/www/html/phoenix,修改phoenix文件夾權限777。並可在http訪問http://cdh001/pheonix。

chmod 777 -R /var/www/html/phoenix
# /var/www/html/phoenix目錄結構如下
-rwxrwxrwx. 1 root root      2478 81 2019 manifest.json
-rwxrwxrwx  1 root root      5306 318 10:37 PHOENIX-1.0.jar
-rwxrwxrwx. 1 root root 402216960 81 2019 PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel
-rwxrwxrwx. 1 root root        41 81 2019 PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel.sha

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dt4oEoO9-1648092283868)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220324105131812.png)]

(2)將parcl包複制到/opt/cloudera/parcel-repo目錄(注意manifest.json要是phoenix目錄中的),並修改權限777。

chmod 777 -R /opt/cloudera/parcel-repo
#/opt/cloudera/parcel-repo目錄結構如下
-rwxrwxrwx. 1 root root      2478 81 2019 manifest.json
-rwxrwxrwx. 1 root root 402216960 81 2019 PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel
-rwxrwxrwx. 1 root root        41 81 2019 PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel.sha

(3)將phoenix的jar包放到/opt/cloudera/csd目錄下,並拷貝到httpd服務目錄下,修改權限777。

chmod 777 *R /opt/cloudera/csd
#/opt/cloudera/csd目錄結構如下
-rwxr-xr-x 1 root root 5306 318 10:39 PHOENIX-1.0.jar

(4)在CM界面操作: “管理”->“設置”->輸入查詢"csd"->本地描述符存儲庫路徑修改為"/opt/cloudera/csd"

在這裏插入圖片描述

在這裏插入圖片描述

(5)在CM界面操作: “主機”->“Parcel”->“配置”->遠程 Parcel 存儲庫 URL中新增phoenix路徑 “http://cdh001/phoenix/”

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

(6)“檢查更新Parcel”->找到PHOENIX “下載”->“分配”->“激活”

在這裏插入圖片描述

在這裏插入圖片描述

(7)在CM主界面操作:集群 菜單欄"添加服務"->選擇"PHOENIX"->quary server節點分配(3集群全部)->服務啟動,回到CM界面可看到Phoenix。
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

(8)配置HBASE, “HBASE”->“配置”->搜索"hbase-site.xml"->“hbase-site.xml的HBase服務高級配置代碼段”,以XML格式查看,粘貼如下內容,並保存。這一步即phoenix整合hbase。

<!-- 定義寫入預寫日志 wal 編碼 -->
<property>
  <name>hbase.regionserver.wal.codec</name>
  <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property> 

<!-- 啟用用戶自定義函數(UDF) -->
<property>
  <name>phoenix.functions.allowUserDefinedFunctions</name>
  <value>true</value>
  <description>enable UDF functions</description>
</property>

在這裏插入圖片描述

(9)保存配置更改,重啟過期服務hbase和phoenix。

(10)將Phoenix安裝路徑配置到系統環境變量中(所有安裝Phoenix的節點執行)。

vim /etc/profile
#--------------------phoenix------------------------------------
export PHOENIX_HOME=/opt/cloudera/parcels/PHOENIX-5.0.0-cdh6.2.0.p0.1308267
export PATH=$PATH:$PHOENIX_HOME/bin

#激活生效
source /etc/profile

(11)任意節點啟動phoenix,通過命令phoenix-sqlline zk節點hostname:2181/hbase 進入交互界面。

phoenix-sqlline cdh185

輸入命令 !table 能看到輸出錶即正常運行了。

在這裏插入圖片描述

Phoenix集成Hive

Hive-phoenix未整合前在hive中創建映射錶報錯

ParseException: Syntax error in line 7:undefined: STORED BY 'org.apache.phoenix.hive.PhoenixStorageHandler' ^ Encountered: BY Expected: AS CAUSED BY: Exception: Syntax error

整合方法:將phoenix安裝目錄下lib中phoenix-5.0.0-cdh6.2.0-hive.jar 拷貝到hive安裝目錄/lib中。所有安裝pheonix節點都需要拷貝。

cp /opt/cloudera/parcels/PHOENIX/lib/phoenix/phoenix-5.0.0-cdh6.2.0-hive.jar /opt/cloudera/parcels/CDH/lib/hive/lib

注:在impala端不能創建hive-phoeinx映射錶。

Hive-Hbase錶映射實現

a、hive映射hbase中已存在的錶

#進入hbase-shell命令:
hbase shell
#創建hbase錶命令:
create 'hbase_test','user'
#插入數據命令:
put 'hbase_test','111','user:name','jack'
put 'hbase_test','111','user:age','18'
#查詢hbase錶命令:scan 'hbase_test'

#進入hive創建hbase關聯錶
create external table hbase_test1(
id int,
name string,
age int
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,user:name,user:age")
TBLPROPERTIES("hbase.table.name" = "hbase_test");

#查看hive錶數據,命令:
select * from hbase_test1
#往hive錶中插入數據:
insert into hbase_test1(id,name,age) values(333,'mary',25);
#查詢hive錶數據 ,命令:
select * from hbase_test1
#同時查詢hbase錶數據,有hive中新增記錄

Phoenix-Hbase錶映射實現

a、phoenix映射hbase中已有的錶

#phoenix-shell啟動命令
phoenix-sqlline.py cdh185:2181

#在phoenix中建立相同的錶名實現與Hbase錶的映射
create table if not exists "hbase_test"(
"id" varchar primary key, 
"user"."name" varchar, 
"user"."age" varchar
)
column_encoded_bytes=0;

create view if not exists "hbase_test2"(
"id" varchar primary key, 
"user"."name" varchar, 
"user"."age" varchar
)
column_encoded_bytes=0;

注意:
Phoneix中創建的錶與HBase中映射的錶名要相同
phoneix中創建錶的字段名與與HBase中映射錶的字段名要相同(注意大小寫)

#插入數據命令:
upsert into "hbase_test"(id,"name","age") values('444','haha','33');
#在hbase中可查看到新增記錄

Hive-Phoenix錶映射實現

Hive端創建內部錶

對於內部錶,Hive管理錶和數據的生命周期。創建Hive錶時,也會創建相應的Phoenix錶。一旦Hive錶被删除,Phoenix錶也被删除。

#hive端創建內部錶,並映射phoenix。
create table hive_phoenix_in_test (
	  s1 string,
	  i1 int,
	  f1 float,
	  d1 double
)
stored as parquetfile
STORED BY 'org.apache.phoenix.hive.PhoenixStorageHandler'
TBLPROPERTIES (
    "phoenix.table.name" = "hive_phoenix_in_test",
    "phoenix.zookeeper.quorum" = "cdh185,cdh186,cdh188",
    "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'"
);

#phoenix端錶數據查詢
select * from hive_phoenix_in_test

#hive端新增數據
insert into hive_phoenix_in_test values("a",1,1.0,1.0);
+-----+-----+------+------+
| s1  | i1  |  f1  |  d1  |
+-----+-----+------+------+
| a   | 1   | 1.0  | 1.0  |
+-----+-----+------+------+

#phoenix端新增數據
upsert into hive_phoenix_in_test values ('b',5,1.85,4.4894165);
upsert into hive_phoenix_in_test values ('b',9,1.85,4.4894165);
+-----+-----+-------+------------+
| s1  | i1  |  f1   |     d1     |
+-----+-----+-------+------------+
| b   | 5   | 1.85  | 4.4894165  |
| a   | 1   | 1.0   | 1.0        |
| b   | 9   | 1.85  | 4.4894165  |
+-----+-----+-------+------------+

#phoenix端更新數據,rowkey相同的進行修改
upsert into hive_phoenix_in_test values ('b',5,1.85,4.54);
+-----+-----+-------+------------+
| s1  | i1  |  f1   |     d1     |
+-----+-----+-------+------------+
| b   | 5   | 1.85  | 4.54       |
| a   | 1   | 1.0   | 1.0        |
| b   | 9   | 1.85  | 4.4894165  |
+-----+-----+-------+------------+

#pheonix端删除數據
delete from hive_phoenix_in_test where "s1"='b' and "i1"=9;
+-----+-----+-------+-------+
| s1  | i1  |  f1   |  d1   |
+-----+-----+-------+-------+
| b   | 5   | 1.85  | 4.54  |
| a   | 1   | 1.0   | 1.0   |
+-----+-----+-------+-------+

Hive端創建外部錶

對於外部錶,Hive與**已有的Phoenix錶**一起使用,僅管理Hive元數據。從Hive中删除EXTERNAL錶只會删除Hive元數據,但不會删除Phoenix錶。

create external table hive_phoenix_out_test (
  i1 int,
  s1 string,
  f1 float,
  d1 decimal
)
STORED BY 'org.apache.phoenix.hive.PhoenixStorageHandler'
TBLPROPERTIES (
  "phoenix.table.name" = "hive_phoenix_out_test",
  "phoenix.zookeeper.quorum" = "cdh185,cdh186,cdh188",
  "phoenix.zookeeper.znode.parent" = "/hbase",
  "phoenix.zookeeper.client.port" = "2181",
  "phoenix.rowkeys" = "i1",
  "phoenix.column.mapping" = "i1:i1, s1:s1, f1:f1, d1:d1"
);

參數說明

phoenix.table.name 					    # 指定映射的phoenix錶名,默認與hive錶相同

phoenix.zookeeper.quorum 			    # hbase的zk管理集群,默認localhost

phoenix.zookeeper.znode.parent 	        # 指定HBase的Zookeeper父節點,默認/hbase

phoenix.zookeeper.client.port 		    # 定zookeeper端口,默認2181

phoenix.rowkeys							# phoenix列錶中的主列,必填

phoenix.column.mapping					# hive和phoenix列名之間的映射

**注意:**所有删除和更新操作都應在phoenix方面執行。

其他配置項,可以再Hive-CLI中設置。

Performance Tuning性能調整

Parameter Default Value Description
phoenix.upsert.batch.size 100 批量更新的數據條數
[phoenix-table-name].disable.wal false 臨時設置錶格屬性disable_wal為true,即關閉預寫功能,有時可以提高性能
[phoenix-table-name].auto.flush false 當預寫功能禁用且自動刷寫設置為true時,memstore刷新為hfile。hbase組件架構

Query Data查詢數據

可以使用hivesql查詢phoenix錶中數據,單個錶上的hive查詢可以像運行phoenix中的查詢一樣快,並具有如下屬性設置:hive.fetch.task.conversion=more和hive.exec.parallel=true。

Parameter Default Value Description
hbase.scan.cache 100 讀取單比特請求的行大小
hbase.scan.cacheblock false 是否緩存塊
split.by.stats false 設置為true時,映射器使用錶統計信息,每個mapper對應一個指南
[hive-table-name].reducer.count 1 reducer個數。在Tez模式下,只影響單錶的查詢。
[phoenix-table-name].query.hint 查詢提示

限制:hive更新和删除操作需要hive和phoenix兩方的事物管理器支持。

列映射無法正確使用映射行鍵列。

mapreduce和tez作業總是只有一個reducer。

Phoenix 常用語法

phoenix交互界面啟用命令:./phoenix-sqlline hbase節點列錶

phoenix的DLL中建議為所有錶名和列名加上雙引號,否則phoenix會全部轉為大寫進行識別,同樣的執行phoenix的查詢命令時要給字符串用單引號,因為雙引號裏面的會被識別為列或錶或列族。

其中row是主鍵,對應hbase的rowkey,其他字段使用"列族".“列名"作為字段名。若hbase錶中的列名包含小數點,如列族為’cf’,列名為’root.a.b’,則在Phoenix的DDL中對應應為"cf”.“root.a.b” varchar。

command 功能 樣例
!tables 查看當前所有數據錶名(等同於show tables) !tables
select 查詢錶數據 select…from…
upsert 新增或更改數據 upsert into tname values(xx)
delete 删除錶記錄 delete from tname

版权声明
本文为[百夜﹍悠ゼ]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204231401520772.html