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

来源:https://www.cnblogs.com/heibaiying/archive/2019/08/27/11416178.html
-Advertisement-
Play Games

一、Phoenix簡介 是 HBase 的開源 SQL 中間層,它允許你使用標準 JDBC 的方式來操作 HBase 上的數據。在 之前,如果你要訪問 HBase,只能調用它的 Java API,但相比於使用一行 SQL 就能實現數據查詢,HBase 的 API 還是過於複雜。 的理念是 ,即你可以 ...


一、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。

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

二、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 均提供了安裝包,按需下載即可。官方下載地址: http://phoenix.apache.org/download.html

# 下載
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 查看當前所有表的信息

三、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 進行查看:

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','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 支持的語法、數據類型、函數、序列等詳細信息,因為涉及內容很多,可以參考其官方文檔,官方文檔上有詳細的說明:

四、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 開源項目大數據入門指南


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是非同步 舉個例子:小明的媽媽讓小明燒一壺水,水燒開後要倒進水壺裡,同時還需要把家裡打掃一下. 小明的操作流程一:燒水 >等待至水燒開 >水倒進水壺裡 >打掃家務 小明的操作流程二:燒水 >打掃家務 >等水燒開了就將水倒進水壺裡 >繼續打掃家務. 第二種方式就是非同步. 非同步的使用 一.以委托方式調 ...
  • .NET Core 公從號開發零基礎系列,包括服務號,小程式所有功能,適用於未接觸過公眾號的同學。 ...
  • 1965 年開始 Multics 工程計劃,該計劃由貝爾實驗室、美國麻省理工學院和通用電氣公司聯合發起,(目標是開發一種互動式的、具有多道程式處理能力的分時操作系統,以取代當時廣泛使用的批處理操作系統。最終失敗)。 UNIX 操作系統由肯•湯普森(Ken Thompson)和丹尼斯•里奇(Denni ...
  • Linux(常用)命令 [TOC] 系統信息 關機 (系統的關機、重啟以及登出 ) 文件和目錄 文件搜索 掛載一個文件系統 磁碟空間 用戶和群組 文件的許可權 使用 "+" 設置許可權,使用 " " 用於取消 打包和壓縮文件 RPM 包 (Fedora, Redhat及類似系統) shell rpm i ...
  • Linux 基礎學習2 [TOC] 文件目錄結構 文件和目錄被組織成一顆倒置的樹狀結構 文件系統從根開始,“/” 文件名稱嚴格區分大小寫 隱藏文件以"."開頭 路徑的分隔符為"/" 文件命名規範 文件字元最長為255個字元 包括路徑在內文件名稱最長為4095個 顏色表示 藍色文件 目錄 綠色文件 可 ...
  • vim是linux和mac中常用到的編輯器。 其分為4種模式: normal模式:普通模式,瀏覽作用 insert模式: i(insert) 在當前游標處進行插入 a(append) 在當前游標後進行插入 o(open a line below) 在當前行下進行插入 I 在當前行首進行插入 A 在當 ...
  • 分區的基礎知識: 模式:mbr分區: 1、最多支持四個主分區 2、系統只能安裝主分區 3、擴展分區要占一個主分區 4、MBR最大隻支持2TB,但擁有最好的相容性 gtp分區: 1、支持無限多個主分區(但操作系統可能限制,比如windows下最多128個分區) 2、最大支持18EB的大容量(EB=10 ...
  • DATEPART() 函數用於返回日期/時間的單獨部分,比如年、月、日、小時、分鐘等等。 DATEDIFF() 函數返回兩個日期之間的時間差。 計算兩個時間差 相差年數:SELECT DATEDIFF(YEAR,'2017-07-01 11:25:52','2018-07-02 12:25:52') ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...