1.簡介
Phoenix是一個HBase框架,可以通過SQL的方式來操作HBase。
Phoenix是構建在HBase上的一個SQL層,是內嵌在HBase中的JDBC驅動,能夠讓用戶使用標准的JDBC來操作HBase。
Phoenix使用JAVA語言進行編寫,其查詢引擎會將SQL查詢語句轉換成一個或多個HBase Scanner,且並行執行生成標准的JDBC結果集。
*如果需要對HBase進行復雜的操作,那么應該使用Phoenix,其會將SQL語句轉換成HBase相應的API。
*Phoenix只能用在HBase上,其查詢性能要遠高於Hive。
2.Phoenix與HBase的關系
Phoenix與HBase中的表是獨立的,兩者之間沒有必然的關系。
Phoenix與HBase集成后會創建8張系統表:SYSTEM.CATALOG、SYSTEM.CHILD_LINK、SYSTEM.FUNCTION、SYSTEM.LOG、SYSTEM.MUTEX、SYSTEM.SEQUENCE、SYSTEM.STATS、SYSTEM.TASK,其中SYSTEM.CATALOG表用於存放Phoenix創建表時的元數據。
Phoenix創建表時會自動調用HBase客戶端創建相應的表,並且在SYSTEM.CATALOG系統表中記錄Phoenix創建表時的元數據,其主鍵的值對應HBase的RowKey,非主鍵的列對應HBase的Column(列族不指定時為0,且列會進行編碼)
如果是通過Phoenix創建的表,那么必須通過Phoenix客戶端來對表進行操作,因為通過Phoenix創建的表其非主鍵的列會進行編碼。
3.Phoenix語法
Phoenix的SQL中如果表名、字段名不使用雙引號標注那么默認轉換成大寫。
Phoenix中的字符串使用單引號進行標注。
在phoenix中,默認情況下,庫名,表名,字段名等會自動轉換為大寫,若要小寫,使用雙引號,如"ns1"。
注意:特別注意引號,總之很變態
SCHEMA操作:
創建schema(就是hbase中的namespace),就是數據庫 create schema IF NOT EXISTS "ns1"; *************使用schema,執行后再創建表,增加記錄等,否則都建在default數據庫中了**************** USE "ns1"; 刪除schema drop schema "ns1";
創建表:
CREATE
TABLE
IF
NOT
EXISTS
user
(
id
varchar
PRIMARY
KEY
,
name
varchar
,
age
integer
);
|
查看:
!tables
|
插入/更新數據:
UPSERT
INTO
user
VALUES
(
'1001'
,
'zhangsan'
, 18);
UPSERT
INTO
user
(id,
name
,age)
VALUES
(
'1002'
,
'lisi'
, 20);
|
如果主鍵的值重復,那么進行更新操作,否則插入一條新的記錄(在進行更新時,沒有更新的列保持原值,在進行插入時,沒有插入的列為null)
在使用UPSERT時,主鍵的列不能為空(包括聯合主鍵)
查詢數據:
SELECT
*
FROM
user
;
|
在進行查詢時,支持ORDER BY、GROUP BY、LIMIT、JOIN等操作,同時Phoenix提供了一系列的函數,其中包括COUNT()、MAX()、MIN()、SUM()等,具體的函數列表可以查看:http://phoenix.apache.org/language/functions.html
不管條件中的列是否是聯合主鍵中的,Phoenix一樣可以支持。
刪除表
DROP
TABLE
user
;
|
退出客戶端
!q
hbase中也可以看到這個USER表和數據
4.Phoenix映射HBase
直接通過HBase客戶端創建的表,若想用Phoenix來進行增、刪、改操作,那么必須要進行表的映射,因為SYSTEM.CATALOG表中並沒有維護Phoenix創建表的元數據,如果只是進行查詢操作,只要用phoenix
來創建映射表即可。
創建表來進行表的映射
CREATE
TABLE
IF
NOT
EXISTS 表名(
列名 類型 主鍵,
列簇.列名,
列簇.列名
)
|
HBase中的RowKey映射Phoenix的主鍵,HBase中的Column映射Phoenix的列,且使用列簇名.列名進行映射。
相當於在SYSTEM.CATALOG表中錄入相關的元數據,使Phoenix能夠進行操作它。
創建視圖來進行表的映射
CREATE
VIEW
視圖名(
列名 類型 主鍵,
列簇.列名,
列簇.列名
)
|
Phoenix中的視圖只能進行查詢,不能進行添加、更新、刪除操作。
5.Phoenix優化
1.服務端配置優化
往HBase安裝目錄下的conf目錄下的hbase-site.xml文件中添加配置。
2.對表中的數據進行分區
哈希取模
通過在創建表時指定SALE_BUCKETS來實現將表中的數據預分割到多個Region中,有利於提高讀取數據的性能。
其原理是將RowKey進行散列,把得到的余數的byte值插入到RowKey的第一個字節中,並通過預定義每個Region的Start Key和End Key,將數據分散存儲到不同的Region中。
CREATE
TABLE
IF
NOT
EXISTS us_population (
state
CHAR
(2)
NOT
NULL
,
city
VARCHAR
NOT
NULL
,
population
BIGINT
CONSTRAINT
my_pk
PRIMARY
KEY
(state, city)
)SALT_BUCKETS=16;
|
通過SALE_BUCKETS設置哈希函數的除數P(除留余數法)
根據值來進行預分區
在創建表時,可以精確的指定RowKey根據什么值來進行預分區,不同的值存儲在獨立的Region中,有利於提高讀取數據的性能。
CREATE
TABLE
IF
NOT
EXISTS us_population (
state
CHAR
(2)
NOT
NULL
,
city
VARCHAR
NOT
NULL
,
population
BIGINT
CONSTRAINT
my_pk
PRIMARY
KEY
(state, city)
)SPLIT
ON
(
'CS'
,
'EU'
,
'NA'
);
|
3.創建表時指定列簇
在HBase中每個列簇對應一個文件,如果要查詢的列其列簇下只有它自己,那么將極大的提高讀取數據的性能。
CREATE
TABLE
IF
NOT
EXISTS us_population (
state
CHAR
(2)
NOT
NULL
,
city
VARCHAR
NOT
NULL
,
C1.population
BIGINT
CONSTRAINT
my_pk
PRIMARY
KEY
(state, city)
);
|
列族只能在非主鍵列中進行指定。
4.對表進行壓縮
在創建表時可以指定表的壓縮方式,能極大的提高數據的讀寫效率。
CREATE
TABLE
IF
NOT
EXISTS us_population (
state
CHAR
(2)
NOT
NULL
,
city
VARCHAR
NOT
NULL
,
population
BIGINT
CONSTRAINT
my_pk
PRIMARY
KEY
(state, city)
)COMPRESSION=
'GZ'
;
|
可選的壓縮方式包括GZip、Snappy、Lzo等。
5.使用二級索引
在HBase中會自動為RowKey添加索引,因此在通過RowKey查詢數據時效率會很高,但是如果要根據其他列來進行組合查詢,那么查詢的性能就很低下,此時可以使用Phoenix提供的二級索引,能夠極大的提高查詢數據的性能。
創建普通索引
CREATE INDEX 索引名稱 ON 表名(列名)
創建二級索引
CREATE
INDEX
索引名稱
ON
表名(列名) INCLUDE(列名)
|
6.Phoenix的搭建
操作步驟,搭建用的是hadoop用戶操作。
1.下載
phoenix與hbase版本對應:http://phoenix.apache.org/download.html
phoenix下載地址:http://www.apache.org/dist/phoenix/
phoenix安裝文檔:http://phoenix.apache.org/installation.html
安裝phoenix(版本與hbase對應)
# 因為hbase版本為1.3.0,這里下載:apache-phoenix-4.15.0-HBase-1.3-bin.tar.gz
cd
/home/hadoop
tar
-zxvf
apache
-phoenix
-4.15.0
-HBase
-1.3
-bin
.tar.gz
mv
apache
-phoenix
-4.15.0
-HBase
-1.3
-bin
phoenix-4.15.0
-HBase
-1.3
|
2.拷貝jar包和配置文件
cd
phoenix-4.15.0
-HBase
-1.3
cp
phoenix-4.15.0
-HBase
-1.3
-server
.jar phoenix
-core
-4.15.0
-HBase
-1.3.jar /home/hadoop/hbase-1.3.0/lib/
cd
/home/hadoop/hbase-1.3.0/conf/
cp
hbase
-site
.xml /home/hadoop/phoenix-4.15.0
-HBase
-1.3/bin/
cd
/home/hadoop/hadoop-2.7.3/etc/hadoop/
cp
hdfs
-site
.xml core
-site
.xml /home/hadoop/phoenix-4.15.0
-HBase
-1.3/bin/
|
3.重啟hbase
bin/stop
-hbase
.sh
bin/start
-hbase
.sh
或者用:
bin/hbase
-daemon
.sh stop master
bin/hbase
-daemon
.sh stop regionsever
bin/hbase
-daemon
.sh start master
bin/hbase
-daemon
.sh start regionsever
|
4.phoenix客戶端連接(java用戶操作)
因為集群中訪問hdfs和hbase需要kerberos認證,所以可以這樣來連接phoenix。
kinit
-kt
/home/java/develop.keytab develop@LXTS.COM
bin/sqlline.py 10-100-31-41,10-100-31-48,10-100-31-49:2181
或者:
bin/sqlline.py 10-100-31-41,10-100-31-48,10-100-31-49:2181:develop@LXTS.COM:/home/java/develop.keytab
|
第一次連接上,phoenix會自動往hbase中生成八張系統表:
完成!
7.使用Java操作Phoenix
導入依賴
<
dependency
>
<
groupId
>org.apache.phoenix
<
artifactId
>phoenix-core
<
version
>4.15.0-HBase-1.3
|
使用標准的JDBC來操作HBase
//加載驅動
Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
//通過DriverManager獲取連接
Connection conn = DriverManager.getConnection("jdbc:phoenix:zk1,zk2,zk3:2181);
//創建Statement實例
Statement statement = conn.prepareStatement(sql);
//執行增、刪、改、查等操作
execute(sql)
executeUpdate(sql)
executeQuery(sql)
|
參考: