1. 程式人生 > >hbase SQL 框架phoenix使用

hbase SQL 框架phoenix使用

1  簡介
    hbase 提供很方便的shell指令碼以及java API等方式對Hbase進行操作,但是對於很對已經習慣了關係型資料庫操作的開發來說,有一定的學習成本,如果可以像操作mysql等一樣通過sql實現對Hbase的操作,那麼很大程度降低了Hbase的使用成本。Apache Phoenix 元件就完成了這種需求,官方註解為 “Phoenix -we put the SQL back in NoSql”,通過官方說明,Phoenix 的效能很高,相對於 hbase 原生的scan 並不會差多少,而對於類似的元件 hive、Impala等,效能有著顯著的提升,詳細請閱讀https://phoenix.apache.org/performance.html。

Apache Phoenix 官方站點:https://phoenix.apache.org/
Phoenix支援的sql語句: https://phoenix.apache.org/language/index.html

Phoenix 支援的DataTypes:https://phoenix.apache.org/language/datatypes.html
Phoenix 支援的函式:https://phoenix.apache.org/language/functions.html

2   安裝配置
2.1   環境說明
       Hbase使用兩臺主機,主機名和IP分別為:

       master          172.18.68.119 

       slave01       172.18.68.88

       master作為主節點,slave01作為從節點,即作為Hbase的HRegionServer。

       hbase的安裝位置:/home/hadoop/hbase

2.2  下載
    在官網http://www.apache.org/dyn/closer.lua/phoenix/中選擇提供的映象站點中下載與安裝的HBase版本對應的版本。本地使用的1.3.1,故下載的apache-phoenix-4.11.0-HBase-1.3/的tar.gz包。

2.3   安裝配置
2.3.1   上傳phoenix到master
       使用secureCRT或者其他傳輸工具將下載的tar包上傳到hbase叢集的master結點中。

       $cd /home/hadoop/

       $mkdir phoenix

       $cd phoenix

       $rz

       $tar -zxvf apache-phoenix-4.11.0-HBase-1.3-bin.tar.gz

       $mv apache-phoenix-4.11.0-HBase-1.3-bin/ phoenix

2.3.2    拷貝phoenix-core-4.11.0-HBase-1.3.jar到RegionServer
       將phoenix-core-4.11.0-HBase-1.3.jar拷貝到hbase叢集中的所有region server的hbase的lib目錄下。在測試環境下,master和slave01均作為regionserver。

       $cd /home/hadoop/phoenix/phoenix

       $cp phoenix-core-4.11.0-HBase-1.3.jar /home/hadoop/hbase/lib 拷貝到master

       $scp -r [email protected]:/home/hadoop/hbase/lib 拷貝到slave01

2.3.3     重啟hbase
       $cd /home/hadoop/hbase/bin

       $./stop-hbase.sh

       $./start-hbase.sh

3  phoenix命令列使用
3.1     進入命令列
       $cd /home/hadoop/phoenix/phoenix/bin進入phoenix的bin目錄

       $./sqlline.py  master 其中的master為Zookeeper所在節點的主機名

3.2    sqlline.py執行sql指令碼
       可以使用sqlline.py命令執行sql指令碼檔案,如下:

       $ cd/home/hadoop/phoenix/phoenix

       $ bin/sqlline.py masterexamples/STOCK_SYMBOL.sql

       STOCK_SYMBOL.sql檔案內容如下:

CREATE TABLE IF NOT EXISTS STOCK_SYMBOL (SYMBOL VARCHAR NOT NULL PRIMARY KEY, COMPANY VARCHAR);

UPSERT INTO STOCK_SYMBOL VALUES ('CRM','SalesForce.com');

SELECT * FROM STOCK_SYMBOL;


3.3   psql.py執行sql指令碼
      可以通過phoenix的bin目錄下的psql.py指令碼載入CSV資料或者執行包含sql指令碼的檔案,如下:

      $cd /home/hadoop/phoenix/phoenix

      $bin/psql.py master ../examples/WEB_STAT.sql ../examples/WEB_STAT.csv ../examples/WEB_STAT_QUERIES.sql

      其中WEB_STAT.sql、WEB_STAT.csv、WEB_STAT_ QUERIES.sql是phoenix提供的samples下的檔案,檔案內容如下:

WEB_STAT.sql 為建立表的sql指令碼檔案

CREATE TABLE IF NOT EXISTS WEB_STAT (

     HOST CHAR(2) NOT NULL,

     DOMAIN VARCHAR NOT NULL,

     FEATURE VARCHAR NOT NULL,

     DATE DATE NOT NULL,

     USAGE.CORE BIGINT,

     USAGE.DB BIGINT,

     STATS.ACTIVE_VISITOR INTEGER

     CONSTRAINT PK PRIMARY KEY (HOST, DOMAIN, FEATURE, DATE)

);

 
WEB_STAT.csv 為資料檔案

NA,Salesforce.com,Login,2013-01-01 01:01:01,35,42,10

EU,Salesforce.com,Reports,2013-01-02 12:02:01,25,11,2

EU,Salesforce.com,Reports,2013-01-02 14:32:01,125,131,42

NA,Apple.com,Login,2013-01-01 01:01:01,35,22,40

NA,Salesforce.com,Dashboard,2013-01-03 11:01:01,88,66,44

NA,Salesforce.com,Login,2013-01-04 06:01:21,3,52,1

EU,Apple.com,Mac,2013-01-01 01:01:01,35,22,34

NA,Salesforce.com,Login,2013-01-04 11:01:11,23,56,45

EU,Salesforce.com,Reports,2013-01-05 03:11:12,75,22,3

EU,Salesforce.com,Dashboard,2013-01-06 05:04:05,12,22,43

                                                 ...

 

WEB_STAT_ QUERIES.sql為查詢指令碼檔案

SELECT DOMAIN, AVG(CORE) Average_CPU_Usage, AVG(DB) Average_DB_Usage

FROM WEB_STAT

GROUP BY DOMAIN

ORDER BY DOMAIN DESC;

-- Sum, Min and Max CPU usage by Salesforce grouped by day

SELECT TRUNC(DATE,'DAY') DAY, SUM(CORE) TOTAL_CPU_Usage, MIN(CORE) MIN_CPU_Usage, MAX(CORE) MAX_CPU_Usage

FROM WEB_STAT

WHERE DOMAIN LIKE 'Salesforce%'

GROUP BY TRUNC(DATE,'DAY');

-- list host and total active users when core CPU usage is 10X greater than DB usage

SELECT HOST, SUM(ACTIVE_VISITOR) TOTAL_ACTIVE_VISITORS

FROM WEB_STAT

WHERE DB > (CORE * 10)

GROUP BY HOST;


 
3.4     phoenix表操作
3.4.1     建立表

CREATE TABLE IF NOT EXISTS us_population (

stateCHAR(2) NOT NULL,

cityVARCHAR NOT NULL,

populationBIGINT

CONSTRAINTmy_pk PRIMARY KEY (state, city));

      在phoenix中,預設情況下,表名等會自動轉換為大寫,若要小寫,使用雙引號,如"us_population"。

3.4.2     顯示所有表
       !table或

       !tables

3.4.3     插入記錄
      upsert into us_population values('NY','NewYork',8143197);

3.4.4     查詢記錄
      select * from us_population ;

       select * from us_population wherestate='NY';

3.4.5     刪除記錄
       delete from us_population wherestate='NY';

3.4.6     刪除表
       drop table us_population;

3.4.7     退出命令列
      !quit

      具體語法參照官網

https://phoenix.apache.org/language/index.html#upsert_select

3.5     phoenix表對映
      預設情況下,直接在hbase中建立的表,通過phoenix是檢視不到的,如圖1和圖2,US_POPULATION是在phoenix中直接建立的,而test是在hbase中直接建立的,預設情況下,在phoenix中是檢視不到test的。

圖1 phoenix命令列中檢視所有表

圖2 hbase命令列中檢視所有表

      如果需要在phoenix中操作直接在hbase中建立的表,則需要在phoenix中進行表的對映。對映方式有兩種:檢視對映和表對映。

      hbase 中test的表結構如下,兩個列簇name、company.


3.5.1   hbase命令列中建立表
       $ cd /home/hadoop/hbase/bin

       $ ./hbase shell 進入hbase命令列

       create 'test','name','company' 建立表,如下圖

     

      下面的檢視對映和表對映均基於該表。

3.5.2    檢視對映
    Phoenix建立的檢視是隻讀的,所以只能用來做查詢,無法通過檢視對源資料進行修改等操作。而且相比於直接建立對映表,檢視的查詢效率會低,原因是:建立對映表的時候,Phoenix會在表中建立一些空的鍵值對,這些空鍵值對的存在可以用來提高查詢效率。

       1)建立檢視

create view"test"(empid varchar primarykey,"name"."firstname" varchar,"name"."lastname"varchar,"company"."name"     varchar,"company"."address"varchar);

       2)刪除檢視

       drop view "test";

3.5.3   表對映
  使用Apache Phoenix建立對HBase的表對映,有兩種方法:

    1) 當HBase中已經存在表時,可以以類似建立檢視的方式建立關聯表,只需要將create view改為create table即可。

    2)當HBase中不存在表時,可以直接使用create table指令建立需要的表,並且在建立指令中可以根據需要對HBase表結構進行顯示的說明。

    第1)種情況下,如在之前的基礎上已經存在了test表,則表對映的語句如下:

create table "test"(empid varchar primarykey,"name"."firstname"varchar,"name"."lastname"varchar,"company"."name" varchar,"company"."address"varchar);

     第2)種情況下,直接使用與第1)種情況一樣的create table語句進行建立即可,這樣系統將會自動在Phoenix和HBase中建立person_infomation的表,並會根據指令內的引數對錶結構進行初始化。

    使用create table建立的關聯表,如果對錶進行了修改,源資料也會改變,同時如果關聯表被刪除,源表也會被刪除。但是檢視就不會,如果刪除檢視,源資料不會發生改變。

4    SQuirrel使用
   如果希望通過客戶端以圖形化的介面操作Phoenix的話,可以下載並安裝SQuirrel。

    SQuirrel SQL Client是一個用Java寫的資料庫客戶端,可以通過一個統一的使用者介面來操作MySQL 、PostgreSQL 、MSSQL、 Oracle等任何支援JDBC訪問的資料庫。使用起來非常方便。

    SQuirrel下載頁面:http://squirrel-sql.sourceforge.net/#installation。

    SQuirrel的安裝步驟(參考https://phoenix.apache.org/installation.html):

    1)移除SQuirrel的lib資料夾下的phoenix-[oldversion]-client.jar(如果有的話),然後拷貝phoenix-[newversion]-client.jar到SQuirrel的lib資料夾下,phoenix-[newversion]-client.jar須與欲連線的hbase的lib下的phoenix版本一致。

    2)windows下,執行squirrel-sql.bat啟動SQuirrel,在啟動介面下,切換到Drivers選項卡,點選+號新增新的驅動。

    3)在新增驅動對話方塊中,設定name為Phoenix,設定Example URL為 jdbc:phoenix:localhost,其中的localhost為hbase使用的Zookeeper主機名。

    4)設定Class Name文字框的內容為 “org.apache.phoenix.jdbc.PhoenixDriver”, 如圖4.1,然後點選“OK”關閉。

    5)切換到Aliases選項卡,點選+新建一個alias。

    6)在對話方塊中,name:任何名稱,Driver:選擇phoenix,username、password可省略,或者填任意值均可。

    7)URL的內容為:jdbc:phoenix: zookeeperquorum server,例如,要連線本機的hbase,URL為:jdbc:phoenix:localhost,如圖4.2。

    8)點選Test,在新對話方塊中選擇connect,如果一切設定正確的話,應該連線成功,然後點選OK關閉對話方塊。

    9)雙擊新建的phoenix alias,點選connect,然後就可以通過phoenix的sql語句操作hbase了,如圖4.3。

圖4.1 新建Driver

圖4.2 新建Alias

圖 4.3 建立連線