在SQuirrel中使用Phoenix操做HBase——建立表和視圖

HBase,一個NoSQL數據庫,可存儲大量非關係型數據。html

HBase,能夠用HBase shell進行操做,也能夠用HBase Java api進行操做。HBase雖然是一個數據庫,可是它的查詢語句,很不太好用。要是能像使用Mysql等關係型數據庫同樣用sql語句操做HBase,那就很Perfect了。java

 

現有工具備不少Hive,Tez,Impala,Shark/Spark,Phoenix等。今天主要記錄Phoenix。node

 

phoenix,由saleforce.com開源的一個項目,後又捐給了Apache。它至關於一個Java中間件,幫助開發者,像使用jdbc訪問關係型數據庫一些,訪問NoSql數據庫HBase。mysql

 

phoenix,操做的表及數據,存儲在hbase上。phoenix只是須要和Hbase進行表關聯起來。而後再用工具進行一些讀或寫操做。linux

其實,能夠把Phoenix只當作一種代替HBase的語法的一個工具。雖然能夠用java能夠用jdbc來鏈接phoenix,而後操做HBase,可是在生產環境中,不能夠用在OLTP(在線事務處理)中。在線事務處理的環境中,須要低延遲,而Phoenix在查詢HBase時,雖然作了一些優化,但延遲仍是不小。因此依然是用在OLAP(聯機分析處理)中,再將結果返回存儲下來。sql

 

Phoenix官網上,對Phoenix講解已經很屌了。若是英語好,能夠看官網,更正式一些。shell

phoenix能幹嗎:官網不少描述,總結一句,就是方便操做了。其餘的,沒有多少優點。數據庫

phoenix不能幹嗎apache

①不支持事務處理api

②不支持複雜的條件

③表之間的關聯操做

 

Phoenix安裝

 

一、下載phoenix

phoenix與HBase版本對應關係

Phoenix 2.x – HBase 0.94.x

Phoenix 3.x – HBase 0.94.x

Phoenix 4.x – HBase 0.98.1+

我目前測試使用版本概況:

Hadoop1.0.4

HBase0.94.18

因此我能夠用phoenix2.xphoenix3.x

官網download頁面有

1111111111111111111111

我選用的是phoenix3.1.0版本。

 

二、上傳到主節點linux就ok了,解壓縮

tar –zxvf phoenix.tar.gz

pwd

/root/phoenix

ll phoenix

201503111800

phoenix目錄結構可能會有點不一樣,主要是bin目錄的位置,可能在hadoop1下,也可能直接在 /root/phoenix下。不要緊,都差很少。

 

三、拷貝一些文件

既然用的hadoop1.x集羣,那麼咱們使用phoenix目錄下,hadoop1目錄下的內容。

將hadoop1下,phoenix-core-3.x.jar拷貝到hadoop集羣各個節點HBase的lib目錄下。

重啓一下HBase (在這裏能夠看出,用phoenix須要重啓hbase,因此選擇hbase查詢工具時,須要考慮一下

四、驗證是否安成功

在主節點上,切換到/root/phoenix/hadoop1/bin目錄下

輸入:

./sqlline.py master:2181

 

201503111803

若是出現這個畫面,那就是成功了。若是不成功,多是zookeeper配置的有一些問題吧。

好吧,先退出此界面,輸入!quit回車而後就能夠退出了。

這個phoenix挺有意思,有一些命令須要輸入歎號的!

 

phoenix的使用

mysql的話,能夠CLI命令行的方式操做;能夠經過用jdbc,在Java代碼中訪問;能夠經過用SQLyog進行訪問管理;

一、phoenix,怎麼用呢?~能夠當作是mysql。

①Phoenix能夠在CLI下操做;

②能夠用jdbc操做;

③能夠用phoenix的一個客戶端工具Squirrel 訪問;

 

二、先說Squirrel吧,這個簡單一些。

Squirrel SQL Client,是一個鏈接數據庫的客戶端工具。通常支持JDBC的數據庫均可以用它來鏈接。(如Squirrel鏈接Mysql)

下載Squirrel SQL Client,解壓縮就能夠了。運行

squirrel-sql.bat

就出現了圖形界面。

三、這確定要說怎樣連Phoenix?

在Squirrel安裝目錄的lib下,添加幾個jar包

a,  phoenix-core-xxx.jar

b,  phoenix-3.0-client.jar

c,  hbase-0.94.18.jar

d,  hadoop1.0.4.jar

e,  hadoop-common-xxx.jar

20140905150155281

 

須要點擊「Drivers」,將phoenix的驅動添加進去。

點擊左上角 藍色的 「 + 」 加號,添加

201503111810

 

按上面的順序,依次填寫。

第一步,Name:隨便寫個名字,標記鏈接;

第二步,Example URL:至關於mysql的jdbc鏈接串,這裏的alias寫zookeeper的主機名稱,端口號,能夠寫,能夠不寫,我通常不寫;

第三步,選擇Phoenix-core的jar包;

第四步,就是手動輸入org.apache.phoenix.jdbc.PhoenixDriver。

而後點擊OK。

配置鏈接

201503111812

 

Name:爲隨便起的名稱。

Driver:選中③中添加的phoenix驅動。

URL:寫如上內容,jdbc:phoenix:node1,node2,master等這裏主要是zookeeper主機名。

User Name:要鏈接的主機的用戶名

Password:要鏈接的主機的密碼

點擊Test能夠進行測試,或點OK鏈接。

鏈接完畢,啓動後,就能夠看到以下的效果了。這裏我已經建立了幾個表了,這些表都是存在於HBase上的。

QQ截圖20150311191101

 

四、Squirrel的一些佈局簡介(看上面這個圖):

1,用squirrel創建的一些鏈接

2,當前鏈接下,全部對象,包括主見系統表,普通表,視圖。

3,爲表,這些表都是實際存在於zookeeper所管理的HBase上的。右鍵此表,能夠對錶進行管理。

4,爲視圖。

5,編寫sql腳本的地方,能夠輸入腳本執行。腳本執行方式,在5上面有一個小人,選中sql,點擊小人就能夠執行了。或者按ctrl + enter鍵,執行。

6,爲選中的對象的一些基本信息,列信息,行數等。

7,爲sql執行的一些狀態。

 

五、在Squirrel中建表或視圖

在Squirrel中建立表的過程主要是編寫sql,進行執行。sql該怎麼寫,須要看phoenix驅動都支持什麼效果。

這須要看phoenix的官網了。

須要注意的是phoenix是區分大小寫的;

本身定義的HBase中的 HTableName,ColumnFamily,以及字段Column,須要和Phoenix中保持一致。(最好都用大寫)

 

phoenix操做hbase,咱們有兩種方式,建立表,建立視圖。

這兩種方式,有區別。

建立表的話,可讀可寫,就能夠對HBase進行插入,查詢,刪除操做。

視圖的話,是隻讀的,通常就只能夠進行查詢操做

雖然看起來,表的功能,比視圖更強大一些。可是就像是mysql等關係型數據庫同樣,刪除表操做,會將表刪掉。可是刪除視圖操做,卻不會影響原始表的結構。

由於使用phoenix,建立表後,會自動和hbase創建關聯映射。當你使用phoenix刪除和hbase之間的關係時,就會將hbase中的表也刪掉了

因此用視圖,會對原始的HBase表影響小一些。

 

六、用phoenix能夠建立表

(1)若hbase中,不存在名爲htablename或htablename2HTable:

1

2

3

4

5

6

create htablename(

    pk VARCHAR primary key not null,

    col1 VARCHAR null,

    col2 VARCHAR null,

    col3 VARCHAR null

)

 

1

2

3

4

5

6

7

create htablename2(

    pk VARCHAR primary key null,

    "cf"."col1" VARCHAR null,

    "cf"."col2" VARCHAR null,

    "cf2"."col3" VARCHAR null,

    "cf2"."col4" VARCHAR null

)

在SQuirreL中執行上面的SQL腳本,執行過程當中,若是出現錯誤,會在工具的下面進行提示。

若成功後,就能夠在HBase中看到這個表了,並且在SQuirrel中,看到此表。

(2)若hbase存在htablename3,但SQuirrel中看不到時

當安裝好SQuirrel時,本覺得連上hbase後,就能夠在SQuirrel中看到hbase中的表了。可是並無看到,也不會顯示。

若是要想看到hbase中已存在的表,還須要一些操做。

 

也就是若是想要在SQuirrel中,看到htablename3,且想要對htablename3進行操做。

也仍是須要在SQuirreL中進行執行建立表的操做,執行完畢後,就會將HBase的htablename3,映射到SQuirreL中。

這樣咱們就能夠在Java api中進行操做了。不然是不能夠的。

 

那麼須要哪些具體操做呢?其實很簡單,我當時沒想到

就像建立表同樣,使用Create table就能夠了。就這樣簡單。

不過這個語句怎麼寫呢?怎樣對應呢?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

create htablename3(

 

    --這句話直接寫就能夠了,這樣的話,HBase中的RowKey轉換成phoenix中的主鍵,列名就叫 pk。

    --rowkey自動會和primary key進行對應。

    pk VARCHAR primary key null,

 

    --將名爲cf的columnFamily下,字段名爲col1的字段,寫在這裏。

    "cf"."col1" VARCHAR null,

 

    --將名爲cf的columnFamily下,字段名爲col2的字段,寫在這裏。。。下面就以此類推

    "cf"."col2" VARCHAR null,

    "cf2"."col3" VARCHAR null,

    "cf2"."col4" VARCHAR null

)

而後在SQuirreL中執行,而後就能夠看到數據了。

不過此時,可能還會有問題,亂碼。 在SQuirrel中,主鍵以及一些包含漢字的字段,都是方塊等亂碼了。這個怎麼解決???(暫未解決)

 

七、用phoenix能夠建立視圖

假如,要對剛剛建立的表htablenameX建立視圖操做

CREATE  VIEW  「htablenameX」   (pk VARCHAR primary key)   default_column_family = ‘FM’

建立完成後,這裏的「htablenameX」 是HBase中table 「htablenameX」的名稱。而後定義一個主鍵,就能夠了。

 

可能還不太清楚,看下面

(1)第一種視圖,假如HBase中存在表」DAMAI」,須要以視圖的方式,操做它,那麼開始建立視圖

CREATE VIEW 「DAMAI」 ( PK VARCHAR PRIMARY KEY) DEFAULT_COLUMN_FAMILY=’FM’

這裏雙引號內的 「DAMAI」 和HBase中的表名是同樣的,因此會自動關聯。

會自動對應表名,自動關聯字段。

這裏須要注意:建立視圖時,要保證在SQuirrel工具中,沒有相同名稱的表存在。

201503111847

 

那麼,若是想針對HBase中的一個表,建多個視圖呢?慢慢來

 

(2)第二種視圖,能夠在Phoenix table的基礎上建立

CREATE VIEW my_VIEW (new_col VARCHAR,new_col2 VARCHAR) AS SELECT * FROM phoenix_Table WHERE ……

也就是,原來在phoenix中,已經建立了表了。

例如:htablename2。在htablename2上創建一個視圖,叫」mingzisuibian」  (名字隨便)

CREATE VIEW mingzisuibian ( new_col VARCHAR, new_col2  VARCHAR )  AS SELECT * FROM htablename2 WHERE ….(針對htablename2的查詢條件)

 

(3)第三種建視圖的方式,是在視圖之上創建視圖

CREATE VIEW my_VIEW_ON_VIEW AS SELECT * FROM MY_VIEW WHERE ……

在(1)中,咱們建立了一個視圖 「DAMAI」。這裏麪包括了所有的字段。

因此說,在建立DAMAI視圖的時候,能夠將所有字段都包括進來。

因此,咱們能夠在DAMAI這個視圖之上,建立其它視圖,這樣視圖的名稱,就能夠隨便定了。

例如:

CREATE VIEW BIGBIG AS SELECT * FROM DAMAI WHERE ……

不斷往hbase中,添加數據,隨着數據的增加,在phoenix建的視圖中也能夠看到的數據的條數,在同步增長。

 

綜上所述,從上面能夠看出,爲了不影響hbase的表信息,最好是建立一個視圖。而後在視圖的基礎上,再建立其它視圖。

也就是,先執行視圖裏面的(1),再執行視圖裏面的(3)。

相關文章
相關標籤/搜索