天天看點

HBase之八--(2):HBase二級索引之Phoenix

1. 介紹

Phoenix 是 Salesforce.com 開源的一個 Java 中間件,可以讓開發者在Apache HBase 上執行 SQL 查詢。Phoenix完全使用Java編寫,代碼位于 GitHub 上,并且提供了一個用戶端可嵌入的 JDBC 驅動。

根據項目所述,Phoenix 被 Salesforce.com 内部使用,對于簡單的低延遲查詢,其量級為毫秒;對于百萬級别的行數來說,其量級為秒。Phoenix 并不是像 HBase 那樣用于 map-reduce job 的,而是通過标準化的語言來通路 HBase 資料的。 Phoenix 為 HBase 提供 SQL 的查詢接口,它在用戶端解析SQL語句,然後轉換為 HBase native 的用戶端語言,并行執行查詢然後生成标準的JDBC結果集。

Phoenix 最值得關注的一些特性 有:

嵌入式的JDBC驅動,實作了大部分的java.sql接口,包括中繼資料API

可以通過多部行鍵或是鍵/值單元對列進行模組化

完善的查詢支援,可以使用多個謂詞以及優化的掃描鍵

DDL支援:通過CREATE TABLE、DROP TABLE及ALTER TABLE來添加/删除列

版本化的模式倉庫:當寫入資料時,快照查詢會使用恰當的模式

DML支援:用于逐行插入的UPSERT VALUES、用于相同或不同表之間大量資料傳輸的UPSERT SELECT、用于删除行的DELETE

通過用戶端的批處理實作的有限的事務支援

表連接配接 和二級索引

緊跟ANSI SQL标準

SQL Support 可以參考 language reference,Phoenix 目前不支援:

完全的事物支援

嵌套查詢

關聯操作: Union、Intersect、Minus

各種各樣的内建函數。可以參考這篇文章添加自定義函數。

2. 安裝

HBase 相容性:

Phoenix 2.x - HBase 0.94.x

Phoenix 3.x - HBase 0.94.x

Phoenix 4.x - HBase 0.98.1+

安裝已經編譯好的 phoenix :

下載下傳對應你 hbase 版本的 phoenix-[version]-incubating.tar 并解壓,下載下傳位址:http://www.apache.org/dyn/closer.cgi/incubator/phoenix/。

添加 phoenix-core-[version]-incubating.jar 到 HBase region server 的 classpath 中,或者直接将其加載到 hbase 的 lib 目錄

重新開機 HBase region server

添加 phoenix-[version]-incubating-client.jar 到 hadoop 用戶端的 lib 目錄。

3. 使用

Java 用戶端連接配接 jdbc 代碼如下:

jdbc 的 url 類似為 <code>jdbc:phoenix [ :&lt;zookeeper quorum&gt; [ :&lt;port number&gt; ] [ :&lt;root node&gt; ] ]</code>,需要引用三個參數:<code>hbase.zookeeper.quorum</code>、<code>hbase.zookeeper.property.clientPort</code>、<code>and zookeeper.znode.parent</code>,這些參數可以預設不填而在 hbase-site.xml 中定義。

進入解壓後的 bin 目錄,執行下面指令可以進入一個指令行模式:

進入之後,可以檢視表和列:

從上面可以看出來,phoenix 中存在兩個系統表:

SYSTEM.CATALOG

SYSTEM.SEQUENCE

通過 HBase Master 的 web 頁面,可以看到上面兩個表的建表語句,例如:

可以用下面腳本執行一個 sql 語句:

執行結果如下:

../examples/STOCK_SYMBOL.sql 檔案主要包括三個 sql 語句:

第一個語句建立表

第二個語句插入一條記錄

第三個語句查詢資料

在 hbase shell 中檢視存在的表:

檢視 <code>STOCK_SYMBOL</code> 表中資料:

可以看到插入了一行記錄,rowkey 為 CRM,而列族名稱為 0 ,存在兩列,一列為指定的COMPANY,另一列為 phoenix 插入的 <code>_0</code>

然後,也可以通過 sqlline.py 來檢視資料:

注意到:從上面查詢看到的就隻有兩列,沒有看到 <code>_0</code> 這一列。

從上可以知道,Phoenix 是建構在 HBase 之上的 SQL 中間層,向 HBase 發送标準 sql 語句,對 HBase 進行操作。

你可以使用 bin/psql.py 來加載 CSV 資料 或者執行 SQL 腳本,例如:

其輸出結果為:

WEB_STAT.sql 中 sql 語句為:

從 sql 語句上可以看出來,HOST、DOMAIN、FEATURE、DATE 這四列前面并沒有指定列族,并且通過限制設定這四列組成 hbase 的 rowkey,其他三列都指定了列族。

通過 sqlline.py 查詢第一條記錄:

而通過 hbase shell 查詢 <code>WEB_STAT</code> 表第一條記錄:

通過上面對比知道:

phoenix 對使用者屏蔽了 rowkey 的設計細節

USAGE 列族中存在一列為 <code>_0</code>,而 STATS 列族中卻沒有,這是為什麼?

Phoenix 把 rowkey 内化為 table 的 PRIMARY KEY 處理,由 HOST、DOMAIN、FEATURE、DATE 這四列拼接在一起,組成了 rowkey

其他可選的加載資料的方法:

使用 map-reduce based CSV loader 加載更大的資料

映射一個存在的 HBase 表到 Phoenix 表 以及使用 UPSERT SELECT 來建立一個新表

使用 UPSERT VALUES 插入記錄

建立一張hbase表:

在phoenix建一張同樣的表:

t1、f、q 需要用雙引号括起來,原因主要是大小寫的問題,參考 phoenix 的 wiki。

注意: 在這裡, phoenix 會修改 table 的 Descriptor,然後添加 coprocessor,是以會先 disable,在 modify,最後 enable 表。

接下來就可以查詢了:

4. 總結

這篇文章主要是介紹了什麼是 Phoenix 、如何安裝以及他的一些特性,然後介紹了他的使用方法,主要包括指令行使用、加載資料以及如何映射存在的 HBase 表,通過該篇文章對 Phoenix 有了一個初步的認識。