PHOENIX操作HBASE
HBase,一個NoSQL資料庫,可儲存大量非關係型資料。
HBase,可以用HBase shell進行操作,也可以用HBase Java api進行操作。HBase雖然是一個數據庫,但是它的查詢語句,很不太好用。要是能像使用Mysql等關係型資料庫一樣用sql語句操作HBase,那就很Perfect了。
現有工具有很多Hive,Tez,Impala,Shark/Spark,Phoenix等。今天主要記錄Phoenix。
phoenix,由saleforce.com開源的一個專案,後又捐給了Apache。它相當於一個Java中介軟體,幫助開發者,像使用jdbc訪問關係型資料庫一些,訪問NoSql資料庫HBase。
phoenix,操作的表及資料,儲存在hbase上。phoenix只是需要和Hbase進行表關聯起來。然後再用工具進行一些讀或寫操作。
其實,可以把Phoenix只看成一種代替HBase的語法的一個工具。雖然可以用java可以用jdbc來連線phoenix,然後操作HBase,但是在生產環境中,不可以用在OLTP(線上事務處理)中。線上事務處理的環境中,需要低延遲,而Phoenix在查詢HBase時,雖然做了一些優化,但延遲還是不小。所以依然是用在OLAP(聯機分析處理)中,再將結果返回儲存下來。
Phoenix官網上,對Phoenix講解已經很屌了。如果英語好,可以看官網,更正式一些。
phoenix能幹嘛:官網很多描述,總結一句,就是方便操作了。其他的,沒有多少優勢。
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.x,phoenix3.x。
官網download頁面有
我選用的是phoenix3.1.0
2、上傳到主節點linux就ok了,解壓縮
tar –zxvf phoenix.tar.gz
pwd
/root/phoenix
ll phoenix
phoenix目錄結構可能會有點不同,主要是bin目錄的位置,可能在hadoop1下,也可能直接在 /root/phoenix下。沒關係,都差不多。
3、拷貝一些檔案
既然用的hadoop1.x叢集,那麼我們使用phoenix目錄下,hadoop1目錄下的內容。
①將hadoop1下,phoenix-core-3.x.jar拷貝到hadoop叢集各個節點HBase的lib目錄下。
②重啟一下HBase (在這裡可以看出,用phoenix需要重啟hbase,所以選擇hbase查詢工具時,需要考慮一下)
4、驗證是否安成功
在主節點上,切換到/root/phoenix/hadoop1/bin目錄下
輸入:
./sqlline.py master:2181
如果出現這個畫面,那就是成功了。如果不成功,可能是zookeeper配置的有一些問題吧。
好吧,先退出此介面,輸入!quit回車然後就可以退出了。
這個phoenix挺有意思,有一些命令需要輸入歎號的!
phoenix的使用
mysql的話,可以CLI命令列的方式操作;可以通過用jdbc,在Java程式碼中訪問;可以通過用SQLyog進行訪問管理;
1、phoenix,怎麼用呢?~可以看成是mysql。
①Phoenix可以在CLI下操作;
②可以用jdbc操作;
③可以用phoenix的一個客戶端工具Squirrel 訪問;
2、先說Squirrel吧,這個簡單一些。
,是一個連線資料庫的客戶端工具。一般支援JDBC的資料庫都可以用它來連線。(如Squirrel連線Mysql)
squirrel-sql.bat
就出現了圖形介面。
3、這肯定要說怎樣連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
②
需要點選“Drivers”,將phoenix的驅動新增進去。
③點選左上角 藍色的 “ + ” 加號,新增
按上面的順序,依次填寫。
第一步,Name:隨便寫個名字,標記連線;
第二步,Example URL:相當於mysql的jdbc連線串,這裡的alias寫zookeeper的主機名稱,埠號,可以寫,可以不寫,我一般不寫;
第三步,選擇Phoenix-core的jar包;
第四步,就是手動輸入org.apache.phoenix.jdbc.PhoenixDriver。
然後點選OK。
④配置連線
Name:為隨便起的名稱。
Driver:選中③中新增的phoenix驅動。
URL:寫如上內容,jdbc:phoenix:node1,node2,master等這裡主要是zookeeper主機名。
User Name:要連線的主機的使用者名稱
Password:要連線的主機的密碼
點選Test可以進行測試,或點OK連線。
連線完畢,啟動後,就可以看到如下的效果了。這裡我已經建立了幾個表了,這些表都是存在於HBase上的。
4、Squirrel的一些佈局簡介(看上面這個圖):
1,用squirrel建立的一些連線
2,當前連線下,所有物件,包括主見系統表,普通表,檢視。
3,為表,這些表都是實際存在於zookeeper所管理的HBase上的。右鍵此表,可以對錶進行管理。
4,為檢視。
5,編寫sql指令碼的地方,可以輸入指令碼執行。指令碼執行方式,在5上面有一個小人,選中sql,點選小人就可以執行了。或者按ctrl + enter鍵,執行。
6,為選中的物件的一些基本資訊,列資訊,行數等。
7,為sql執行的一些狀態。
5、在Squirrel中建表或檢視
在Squirrel中建立表的過程主要是編寫sql,進行執行。sql該怎麼寫,需要看phoenix驅動都支援什麼效果。
這需要看phoenix的官網了。
需要注意的是phoenix是區分大小寫的;
自己定義的HBase中的 HTableName,ColumnFamily,以及欄位Column,需要和Phoenix中保持一致。(最好都用大寫)
phoenix操作hbase,我們有兩種方式,建立表,建立檢視。
這兩種方式,有區別。
建立表的話,可讀可寫,就可以對HBase進行插入,查詢,刪除操作。
檢視的話,是隻讀的,一般就只可以進行查詢操作
雖然看起來,表的功能,比檢視更強大一些。但是就像是mysql等關係型資料庫一樣,刪除表操作,會將表刪掉。但是刪除檢視操作,卻不會影響原始表的結構。
因為使用phoenix,建立表後,會自動和hbase建立關聯對映。當你使用phoenix刪除和hbase之間的關係時,就會將hbase中的表也刪掉了
所以用檢視,會對原始的HBase表影響小一些。
6、用phoenix可以建立表
(1)若hbase中,不存在名為htablename或htablename2的HTable:
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中,主鍵以及一些包含漢字的欄位,都是方塊等亂碼了。這個怎麼解決???(暫未解決)
7、用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工具中,沒有相同名稱的表存在。
那麼,如果想針對HBase中的一個表,建多個檢視呢?慢慢來
(2)第二種檢視,可以在Phoenix table的基礎上建立
CREATE VIEW my_VIEW (new_col VARCHAR,new_col2 VARCHAR) AS SELECT * FROM phoenix_TableWHERE ……
也就是,原來在phoenix中,已經建立了表了。
例如:htablename2。在htablename2上建立一個檢視,叫”mingzisuibian” (名字隨便)
CREATE VIEW mingzisuibian ( new_col VARCHAR, new_col2 VARCHAR ) AS SELECT * FROMhtablename2 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)。