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

1、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 JPAMybatis 等經常使用的持久層框架來操做 HBase。html

其次 Phoenix 的性能表現也很是優異,Phoenix 查詢引擎會將 SQL 查詢轉換爲一個或多個 HBase Scan,經過並行執行來生成標準的 JDBC 結果集。它經過直接使用 HBase API 以及協處理器和自定義過濾器,能夠爲小型數據查詢提供毫秒級的性能,爲千萬行數據的查詢提供秒級的性能。同時 Phoenix 還擁有二級索引等 HBase 不具有的特性,由於以上的優勢,因此 Phoenix 成爲了 HBase 最優秀的 SQL 中間層。java

2、Phoenix安裝

咱們能夠按照官方安裝說明進行安裝,官方說明以下: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

2.1 下載並解壓

官方針對 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

2.2 拷貝Jar包

按照官方文檔的說明,須要將 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

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 查看當前全部表的信息apache

3、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));

新建的表會按照特定的規則轉換爲 HBase 上的表,關於表的信息,能夠經過 Hbase Web UI 進行查看:mybatis

3.2 插入數據

Phoenix 中插入數據採用的是 UPSERT 而不是 INSERT,由於 Phoenix 並無更新操做,插入相同主鍵的數據就視爲更新,因此 UPSERT 就至關於 UPDATE+INSERTapp

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','New York',999999);

3.4 刪除數據

DELETE FROM us_population WHERE city='Dallas';

3.5 查詢數據

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

3.6 退出命令

!quit

3.7 擴展

從上面的操做中能夠看出,Phoenix 支持大多數標準的 SQL 語法。關於 Phoenix 支持的語法、數據類型、函數、序列等詳細信息,由於涉及內容不少,能夠參考其官方文檔,官方文檔上有詳細的說明:

4、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 包,而後手動引入:

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();
    }
}

結果以下:

實際的開發中咱們一般都是採用第三方框架來操做數據庫,如 mybatisHibernateSpring Data 等。關於 Phoenix 與這些框架的整合步驟參見下一篇文章:Spring/Spring Boot + Mybatis + Phoenix

參考資料

  1. http://phoenix.apache.org/

更多大數據系列文章能夠參見 GitHub 開源項目大數據入門指南

相關文章
相關標籤/搜索