15分鐘瞭解Apache Phoenix(HBase的開源SQL引擎)
什麼是Phoenix?
Phoenix是一個Hbase的開源SQL引擎。你可以使用標準的JDBC API代替hbase客戶端API來建立表,插入資料,查詢你的HBase資料。
不要在我的程式和HBase之間增加額外的層,它只會拖慢速度的?
事實上,不會。Phoenix通過以下方式實現了比你自己手寫的方式相同或者可能是更好的效能(更不用說可以少寫了很多程式碼):
* 編譯你的SQL查詢為原生HBase的scan語句
* 檢測scan語句最佳的開始和結束的key
* 精心編排你的scan語句讓他們並行執行
* 讓計算去接近資料通過
* 推送你的WHERE子句的謂詞到服務端過濾器處理
* 執行聚合查詢通過服務端鉤子(稱為協同處理器)
除此之外,我們還做了一些有趣的增強功能來更多地優化效能:
* 實現了二級索引來提升非主鍵欄位查詢的效能
* 統計相關資料來提高並行化水平,並幫助選擇最佳優化方案
* 跳過掃描過濾器來優化IN,LIKE,OR查詢
* 優化主鍵的鹽值來均勻分佈寫壓力
好吧,它很快。但是為什麼要用SQL?這已經是70年代的東西了。
一種觀點是:給大夥兒一些他們已經熟悉的東西吧。什麼是更好的方式去激勵他們使用HBase呢?最好的方式就是使用JDBC和SQL,原因有以下幾點:
* 降低使用者需要寫的程式碼的數量
* 讓效能優化對使用者透明
* 方便利用和整合大量的已經存在的工具
但是怎樣才能讓SQL支援我最喜愛的HBase的某些技術
不要把這(使用Phoenix後)當作是你見HBase的最後一次好吧?SQL只是一種表達你想實現的功能的方式,你不必去思考怎樣用SQL去實現功能(原文是SQL is just a way of expressing what you want to get not how you want to get it)。針對目前已經存在或者正在做的Phoenix功能,看看能否支援你喜歡的HBase的特殊用法。你有自己的想法?我們很樂意聽到你的想法:把問題寫下來給我們同時也可以加入我們的郵件列表。
說了這麼多,我只是想知道如何開始?
非常棒!只要跟隨我們的安裝指南:
* 下載並解壓我們的安裝包
* 拷貝能夠與你的Hbase安裝相容的phoenix的服務端jar包到每個叢集節點的lib目錄
* 重啟你的叢集節點
* 新增phoenix的客戶端jar包到你的HBase客戶端的classpath下
* 下載並設定SQuirrel作為你的SQL客戶端,這樣你就可以發起即時查詢的SQL語句來操作你的HBase叢集
我不想要下載安裝其他東西了!
好吧,有道理 - 你可以建立你自己的SQL指令碼並使用我們的命令列工具來執行他們(來代替前面說的下載安裝軟體的方案)。現在讓我們來看一個例子。
定位到你安裝Phoenix路徑的bin目錄來開始。
- 首先,讓我們來建立一個
us_population.sql
的檔案,包含一個表的定義過程:
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));
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
- 現在讓我們建立一個
us_population.csv
檔案,包含一些要放到表裡的資料:
NY,New York,8143197
CA,Los Angeles,3844829
IL,Chicago,2842518
TX,Houston,2016582
PA,Philadelphia,1463281
AZ,Phoenix,1461575
TX,San Antonio,1256509
CA,San Diego,1255540
TX,Dallas,1213825
CA,San Jose,912332
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 最後,讓我們建立一個
us_population_queries.sql
檔案,包含一個我們想在哪些資料上做的查詢。
SELECT state as "State",count(city) as "City Count",sum(population) as "Population Sum"
FROM us_population
GROUP BY state
ORDER BY sum(population) DESC;
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 在命令列終端上執行下面的命令
./psql.py <your_zookeeper_quorum> us_population.sql us_population.csv us_population_queries.sql
- 1
- 1
祝賀!你已經建立了你的第一個Phoenix表了,插入資料進去,並且執行了一個只有幾行資料的聚合查詢程式碼,在15分鐘以內!
了不起 - 10行資料!還獲得了什麼?
好吧,真是難對付的人。檢視一下我們的bin/performance.py
指令碼,針對你提出的資料庫模式,去建立你想要的行數的資料,然後執行耗時的查詢。
為什麼要叫Phoenix(鳳凰)呢?是不是之前有其他什麼專案崩潰或者燒燬,然後這個是它的下一代版本?
很抱歉,但是我們沒有時間和空間了,所以我們下次再來回答這個問題。