Phoenix整合Hbase,用SQL來操作Hbase


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.phoenixgroupId>
     < artifactId >phoenix-coreartifactId>
     < version >4.15.0-HBase-1.3version>
dependency>

使用標准的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)

 

 

參考:

Phoenix整合Hbase,用SQL來操作Hbase 

Phoenix(SQL On HBase) 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM