1. 程式人生 > 程式設計 >HBase 系列(十)—— HBase 的 SQL 中間層 Phoenix

HBase 系列(十)—— HBase 的 SQL 中間層 Phoenix

一、Phoenix簡介

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。

其次 Phoenix

的效能表現也非常優異,Phoenix 查詢引擎會將 SQL 查詢轉換為一個或多個 HBase Scan,通過並行執行來生成標準的 JDBC 結果集。它通過直接使用 HBase API 以及協處理器和自定義過濾器,可以為小型資料查詢提供毫秒級的效能,為千萬行資料的查詢提供秒級的效能。同時 Phoenix 還擁有二級索引等 HBase 不具備的特性,因為以上的優點,所以 Phoenix 成為了 HBase 最優秀的 SQL 中間層。

https://github.com/heibaiying

二、Phoenix安裝

我們可以按照官方安裝說明進行安裝,官方說明如下:

  • 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

2.1 下載並解壓

官方針對 Apache 版本和 CDH 版本的 HBase 均提供了安裝包,按需下載即可。官方下載地址: phoenix.apache.org/download.ht…

# 下載
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 複製程式碼

2.2 拷貝Jar包

按照官方檔案的說明,需要將 phoenix server jar 新增到所有 Region Servers 的安裝目錄的 lib 目錄下。

這裡由於我搭建的是 HBase 偽叢集,所以只需要拷貝到當前機器的 HBase 的 lib 目錄下。如果是真實叢集,則使用 scp 命令分發到所有 Region Servers 機器上。

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
複製程式碼

2.3 重啟 Region Servers

# 停止Hbase
stop-hbase.sh
# 啟動Hbase
start-hbase.sh
複製程式碼

2.4 啟動Phoenix

在 Phoenix 解壓目錄下的 bin 目錄下執行如下命令,需要指定 Zookeeper 的地址:

  • 如果 HBase 採用 Standalone 模式或者偽叢集模式搭建,則預設採用內建的 Zookeeper 服務,埠為 2181;
  • 如果是 HBase 是叢集模式並採用外接的 Zookeeper 叢集,則按照自己的實際情況進行指定。
# ./sqlline.py hadoop001:2181
複製程式碼

2.5 啟動結果

啟動後則進入了 Phoenix 互動式 SQL 命令列,可以使用 !table 或 !tables 檢視當前所有表的資訊

https://github.com/heibaiying

三、Phoenix 簡單使用

3.1 建立表

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));
複製程式碼

https://github.com/heibaiying
新建的表會按照特定的規則轉換為 HBase 上的表,關於表的資訊,可以通過 Hbase Web UI 進行檢視:

https://github.com/heibaiying

3.2 插入資料

Phoenix 中插入資料採用的是 UPSERT 而不是 INSERT,因為 Phoenix 並沒有更新操作,插入相同主鍵的資料就視為更新,所以 UPSERT 就相當於 UPDATE+INSERT

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);
複製程式碼

3.3 修改資料

-- 插入主鍵相同的資料就視為更新
UPSERT INTO us_population VALUES('NY',999999);
複製程式碼

https://github.com/heibaiying

3.4 刪除資料

DELETE FROM us_population WHERE city='Dallas';
複製程式碼

https://github.com/heibaiying

3.5 查詢資料

SELECT state as "州",count(city) as "市",sum(population) as "熱度"
FROM us_population
GROUP BY state
ORDER BY sum(population) DESC;
複製程式碼

https://github.com/heibaiying

3.6 退出命令

!quit
複製程式碼

3.7 擴充套件

從上面的操作中可以看出,Phoenix 支援大多數標準的 SQL 語法。關於 Phoenix 支援的語法、資料型別、函式、序列等詳細資訊,因為涉及內容很多,可以參考其官方檔案,官方檔案上有詳細的說明:

四、Phoenix Java API

因為 Phoenix 遵循 JDBC 規範,並提供了對應的資料庫驅動 PhoenixDriver,這使得采用 Java 語言對其進行操作的時候,就如同對其他關係型資料庫一樣,下面給出基本的使用示例。

4.1 引入Phoenix core JAR包

如果是 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 包,然後手動引入:

https://github.com/heibaiying

4.2 簡單的Java API例項

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();
    }
}
複製程式碼

結果如下:

https://github.com/heibaiying

實際的開發中我們通常都是採用第三方框架來操作資料庫,如 mybatis,Hibernate,Spring Data 等。關於 Phoenix 與這些框架的整合步驟參見下一篇文章:Spring/Spring Boot + Mybatis + Phoenix

參考資料

  1. phoenix.apache.org/

更多大資料系列文章可以參見 GitHub 開源專案: 大資料入門指南