Phoenix
是 HBase 的開源 SQL 中間層,它容許你使用標準 JDBC 的方式來操做 HBase 上的數據。在 Phoenix
以前,若是你要訪問 HBase,只能調用它的 Java API,但相比於使用一行 SQL 就能實現數據查詢,HBase 的 API 仍是過於複雜。Phoenix
的理念是 we put sql SQL back in NOSQL
,即你可使用標準的 SQL 就能完成對 HBase 上數據的操做。同時這也意味着你能夠經過集成 Spring Data JPA
或 Mybatis
等經常使用的持久層框架來操做 HBase。html
其次 Phoenix
的性能表現也很是優異,Phoenix
查詢引擎會將 SQL 查詢轉換爲一個或多個 HBase Scan,經過並行執行來生成標準的 JDBC 結果集。它經過直接使用 HBase API 以及協處理器和自定義過濾器,能夠爲小型數據查詢提供毫秒級的性能,爲千萬行數據的查詢提供秒級的性能。同時 Phoenix 還擁有二級索引等 HBase 不具有的特性,由於以上的優勢,因此 Phoenix
成爲了 HBase 最優秀的 SQL 中間層。java
咱們能夠按照官方安裝說明進行安裝,官方說明以下:git
- download and expand our installation tar
- copy the phoenix server jar that is compatible with your HBase installation into the lib directory of every region server
- restart the region servers
- add the phoenix client jar to the classpath of your HBase client
- download and setup SQuirrel as your SQL client so you can issue adhoc SQL against your HBase cluster
官方針對 Apache 版本和 CDH 版本的 HBase 均提供了安裝包,按需下載便可。官方下載地址: http://phoenix.apache.org/download.htmlgithub
# 下載 wget http://mirror.bit.edu.cn/apache/phoenix/apache-phoenix-4.14.0-cdh5.14.2/bin/apache-phoenix-4.14.0-cdh5.14.2-bin.tar.gz # 解壓 tar tar apache-phoenix-4.14.0-cdh5.14.2-bin.tar.gz
按照官方文檔的說明,須要將 phoenix server jar
添加到全部 Region Servers
的安裝目錄的 lib
目錄下。sql
這裏因爲我搭建的是 HBase 僞集羣,因此只須要拷貝到當前機器的 HBase 的 lib 目錄下。若是是真實集羣,則使用 scp 命令分發到全部 Region Servers
機器上。shell
cp /usr/app/apache-phoenix-4.14.0-cdh5.14.2-bin/phoenix-4.14.0-cdh5.14.2-server.jar /usr/app/hbase-1.2.0-cdh5.15.2/lib
# 中止Hbase stop-hbase.sh # 啓動Hbase start-hbase.sh
在 Phoenix 解壓目錄下的 bin
目錄下執行以下命令,須要指定 Zookeeper 的地址:數據庫
# ./sqlline.py hadoop001:2181
啓動後則進入了 Phoenix 交互式 SQL 命令行,可使用 !table
或 !tables
查看當前全部表的信息apache
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));
新建的表會按照特定的規則轉換爲 HBase 上的表,關於表的信息,能夠經過 Hbase Web UI 進行查看:mybatis
Phoenix 中插入數據採用的是 UPSERT
而不是 INSERT
,由於 Phoenix 並無更新操做,插入相同主鍵的數據就視爲更新,因此 UPSERT
就至關於 UPDATE
+INSERT
app
UPSERT INTO us_population VALUES('NY','New York',8143197); UPSERT INTO us_population VALUES('CA','Los Angeles',3844829); UPSERT INTO us_population VALUES('IL','Chicago',2842518); UPSERT INTO us_population VALUES('TX','Houston',2016582); UPSERT INTO us_population VALUES('PA','Philadelphia',1463281); UPSERT INTO us_population VALUES('AZ','Phoenix',1461575); UPSERT INTO us_population VALUES('TX','San Antonio',1256509); UPSERT INTO us_population VALUES('CA','San Diego',1255540); UPSERT INTO us_population VALUES('TX','Dallas',1213825); UPSERT INTO us_population VALUES('CA','San Jose',912332);
-- 插入主鍵相同的數據就視爲更新 UPSERT INTO us_population VALUES('NY','New York',999999);
DELETE FROM us_population WHERE city='Dallas';
SELECT state as "州",count(city) as "市",sum(population) as "熱度" FROM us_population GROUP BY state ORDER BY sum(population) DESC;
!quit
從上面的操做中能夠看出,Phoenix 支持大多數標準的 SQL 語法。關於 Phoenix 支持的語法、數據類型、函數、序列等詳細信息,由於涉及內容不少,能夠參考其官方文檔,官方文檔上有詳細的說明:
語法 (Grammar) :https://phoenix.apache.org/language/index.html
函數 (Functions) :http://phoenix.apache.org/language/functions.html
數據類型 (Datatypes) :http://phoenix.apache.org/language/datatypes.html
序列 (Sequences) :http://phoenix.apache.org/sequences.html
聯結查詢 (Joins) :http://phoenix.apache.org/joins.html
由於 Phoenix 遵循 JDBC 規範,並提供了對應的數據庫驅動 PhoenixDriver
,這使得采用 Java 語言對其進行操做的時候,就如同對其餘關係型數據庫同樣,下面給出基本的使用示例。
若是是 maven 項目,直接在 maven 中央倉庫找到對應的版本,導入依賴便可:
<!-- https://mvnrepository.com/artifact/org.apache.phoenix/phoenix-core --> <dependency> <groupId>org.apache.phoenix</groupId> <artifactId>phoenix-core</artifactId> <version>4.14.0-cdh5.14.2</version> </dependency>
若是是普通項目,則能夠從 Phoenix 解壓目錄下找到對應的 JAR 包,而後手動引入:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class PhoenixJavaApi { public static void main(String[] args) throws Exception { // 加載數據庫驅動 Class.forName("org.apache.phoenix.jdbc.PhoenixDriver"); /* * 指定數據庫地址,格式爲 jdbc:phoenix:Zookeeper 地址 * 若是 HBase 採用 Standalone 模式或者僞集羣模式搭建,則 HBase 默認使用內置的 Zookeeper,默認端口爲 2181 */ Connection connection = DriverManager.getConnection("jdbc:phoenix:192.168.200.226:2181"); PreparedStatement statement = connection.prepareStatement("SELECT * FROM us_population"); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { System.out.println(resultSet.getString("city") + " " + resultSet.getInt("population")); } statement.close(); connection.close(); } }
結果以下:
實際的開發中咱們一般都是採用第三方框架來操做數據庫,如 mybatis
,Hibernate
,Spring Data
等。關於 Phoenix 與這些框架的整合步驟參見下一篇文章:Spring/Spring Boot + Mybatis + Phoenix
更多大數據系列文章能夠參見 GitHub 開源項目: 大數據入門指南