返回文章列表

Hive 表格管理與 HBase NoSQL 資料庫操作實務

本文探討 Apache Hive 與 Apache HBase 兩大數據處理框架。首先,文章詳述如何使用 HiveQL 建立與操作表格,包含定義受管與外部表格結構、透過 INSERT 語句載入數據,並觸發 MapReduce 作業。接著,介紹 Apache HBase 作為一個基於 HDFS 的 NoSQL

大數據 數據工程

在 Hadoop 生態系中,數據儲存與分析工具的選擇至關重要。Apache Hive 將熟悉的 SQL 介面帶入大數據世界,透過 HiveQL 將查詢轉換為 MapReduce 作業,降低了處理 HDFS 龐大資料集的門檻,成為數據倉儲與批次處理的標準方案。然而,當應用場景需要對非結構化數據進行低延遲的隨機讀寫時,傳統批次處理框架便顯不足。Apache HBase 作為一個基於 HDFS 的 NoSQL 分散式資料庫,其寬列儲存模型正是為了解決這類即時存取需求而設計。本篇文章將從實務操作切入,分別解析這兩種工具在表格定義、數據載入與查詢上的核心機制,幫助讀者建立清晰的技術藍圖。

建立與操作 Hive 表格:從結構定義到數據查詢

本節將引導您完成在 Apache Hive 中建立表格、載入數據以及執行查詢的完整流程,重點關注 HiveQL 語法和數據操作的實際步驟。

建立 Hive 表格

在連接到 HiveServer2 後,我們可以開始定義表格結構。

  1. 創建表格命令: 我們將創建一個名為 wlslog 的表格,用於儲存 WebLogic Server 的日誌信息。該表格將包含以下欄位,均為字串類型:time_stampcategorytypeservernamecodemsg。 Hive 使用 SerDe(Serializer/Deserializer)來處理數據的序列化和反序列化。如果未明確指定 ROW FORMAT,則使用 Hive 的原生 SerDe。對於分隔符數據,我們使用 ROW FORMAT DELIMITED,並指定字段分隔符為逗號(,),行結束符為換行符(\n)。

    使用以下 HiveQL 命令創建一個受管表格

    CREATE TABLE wlslog(
        time_stamp STRING,
        category STRING,
        type STRING,
        servername STRING,
        code STRING,
        msg STRING
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n';
    

    如果您想創建一個外部表格,則命令會是 CREATE EXTERNAL TABLE wlslog(...)。受管表格的數據和元數據都由 Hive 管理,刪除表格會同時刪除數據;外部表格只管理元數據,數據保留在 HDFS 的原始位置。

  2. 查看表格結構: 創建表格後,可以使用 DESCRIBE 命令(或其縮寫 DESC)來查看表格的結構,包括欄位名稱和數據類型:

    DESC wlslog;
    

    這將會列出 wlslog 表的 Schema 定義。

載入數據至 Hive 表格

表格結構定義完成後,我們需要將數據載入其中。

  1. 單行數據插入: 可以使用 INSERT INTO TABLE 語句向表格中添加數據。請注意,由於我們沒有為 wlslog 表定義主鍵(PRIMARY KEY),因此可以插入重複的數據。 首先,插入一條記錄:

    INSERT INTO TABLE wlslog VALUES (
        'Apr-8-2014-7:06:16-PM-PDT',
        'Notice',
        'WebLogicServer',
        'AdminServer',
        'BEA-000365',
        'Server state changed to STANDBY'
    );
    

    執行此命令時,Hive 會啟動一個 MapReduce 作業來處理數據載入。通常,對於單行插入,這個 MapReduce 作業可能只包含一個 MapTask 和零個 ReduceTask。

  2. 批量插入多行數據: 為了演示,我們將插入更多數據,包括一條包含重複字段值的記錄:

    INSERT INTO TABLE wlslog VALUES (
        'Apr-8-2014-7:06:16-PM-PDT',
        'Notice',
        'WebLogicServer',
        'AdminServer',
        'BEA-000365',
        'Server state changed to STANDBY'
    ); -- 插入重複數據
    INSERT INTO TABLE wlslog VALUES (
        'Apr-8-2014-7:06:17-PM-PDT',
        'Notice',
        'WebLogicServer',
        'AdminServer',
        'BEA-000365',
        'Server state changed to STARTING'
    );
    INSERT INTO TABLE wlslog VALUES (
        'Apr-8-2014-7:06:18-PM-PDT',
        'Notice',
        'WebLogicServer',
        'AdminServer',
        'BEA-000365',
        'Server state changed to ADMIN'
    );
    INSERT INTO TABLE wlslog VALUES (
        'Apr-8-2014-7:06:19-PM-PDT',
        'Notice',
        'WebLogicServer',
        'AdminServer',
        'BEA-000365',
        'Server state changed to RESUMING'
    );
    INSERT INTO TABLE wlslog VALUES (
        'Apr-8-2014-7:06:20-PM-PDT',
        'Notice',
        'WebLogicServer',
        'AdminServer',
        'BEA-000331',
        'Started WebLogic AdminServer'
    );
    INSERT INTO TABLE wlslog VALUES (
        'Apr-8-2014-7:06:21-PM-PDT',
        'Notice',
        'WebLogicServer',
        'AdminServer',
        'BEA-000365',
        'Server state changed to RUNNING'
    );
    INSERT INTO TABLE wlslog VALUES (
        'Apr-8-2014-7:06:22-PM-PDT',
        'Notice',
        'WebLogicServer',
        'AdminServer',
        'BEA-000360',
        'Server started in RUNNING mode'
    );
    

    每次執行 INSERT 語句都會啟動一個 MapReduce 作業來將數據寫入 Hive 表格。

查詢 Hive 表格

數據載入完成後,就可以使用 SELECT 語句來查詢表格中的數據。

  1. 查詢所有數據: 執行以下 HiveQL 查詢,將會返回 wlslog 表中的所有行和所有列:
    SELECT * FROM wlslog;
    
    查詢結果將會列出所有已插入的 8 行數據。

停止 Apache Hive

完成 Hive 的操作後,可以停止運行 Hive 的 Docker 容器。

  1. 停止容器: 在宿主機的終端(而不是容器內的終端)執行以下命令:
    sudo docker stop cdh
    
    這將會停止名為 cdh 的 Docker 容器,從而停止其中的 Hive 服務和其他 CDH 組件。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

object "使用者" as User
object "Beeline CLI" as BeelineCLI
object "HiveServer2" as HiveServer2
object "Metastore DB (Derby)" as MetastoreDB
object "HDFS" as HDFS
object "MapReduce Job" as MR_Job
object "Hive Container (cdh)" as HiveContainer

partition "表格建立與結構定義" {
  User --> BeelineCLI : 執行 CREATE TABLE wlslog ...
  BeelineCLI --> HiveServer2 : 發送建表語句
  HiveServer2 --> MetastoreDB : 儲存表格元數據
  User --> BeelineCLI : 執行 DESC wlslog;
  BeelineCLI --> HiveServer2 : 發送描述表語句
  HiveServer2 --> MetastoreDB : 讀取表格元數據
  HiveServer2 --> User : 返回表格結構
}

partition "數據載入" {
  User --> BeelineCLI : 執行 INSERT INTO TABLE wlslog VALUES ...
  BeelineCLI --> HiveServer2 : 發送插入語句
  HiveServer2 --> MR_Job : 啟動 MapReduce 作業
  MR_Job --> HDFS : 寫入數據到 Hive Warehouse
  MR_Job --> User : 顯示 MapReduce 執行進度
  HiveServer2 --> User : 確認數據載入完成
}

partition "數據查詢" {
  User --> BeelineCLI : 執行 SELECT * FROM wlslog;
  BeelineCLI --> HiveServer2 : 發送查詢語句
  HiveServer2 --> MetastoreDB : 獲取表格位置和 Schema
  HiveServer2 --> HDFS : 讀取表格數據
  HiveServer2 --> User : 返回查詢結果
}

partition "資源釋放" {
  User --> DockerDaemon : 執行 sudo docker stop cdh (在宿主機)
  DockerDaemon --> HiveContainer : 停止 Hive 容器
}

@enduml

看圖說話:

此圖示詳細闡述了在 Apache Hive 中進行表格操作的整個生命週期。首先,它展示了使用者如何通過 Beeline CLI 發送 CREATE TABLEDESC 命令,與 HiveServer2 互動,進而由 HiveServer2 在 Metastore DB 中儲存元數據並在 HDFS 中準備數據儲存空間。接著,圖示描繪了數據載入的過程:使用者通過 Beeline CLI 發送 INSERT 語句,HiveServer2 隨即啟動 MapReduce Job,將數據寫入 HDFS 的 Hive Warehouse 目錄。最後,展示了使用者如何通過 Beeline CLI 發送 SELECT * FROM wlslog 查詢語句,HiveServer2 根據 Metastore DB 中的信息從 HDFS 讀取數據,並將結果返回給使用者。圖示的最後部分則標示了如何通過 Docker 命令停止 Hive 容器,釋放資源。整體而言,該圖示清晰地呈現了 Hive 在表格建立、數據載入和查詢過程中的內部工作流程與組件協作。

探索 Apache HBase:NoSQL 資料庫與環境設定

本章節將引導您認識 Apache HBase,一個基於 Hadoop 的 NoSQL 資料庫,並著重於其核心概念、架構以及在 Docker 環境中進行初步設定的步驟。

Apache HBase 核心概念與架構

Apache HBase 是一個開源、分散式、版本化的、面向列的資料庫,它運行在 Hadoop 的 HDFS 之上,並利用 Hadoop 的擴展性和容錯能力。

  • 寬列數據模型 (Wide Column Data Store Model):HBase 的核心是一個寬列數據模型。與傳統的關聯式資料庫不同,HBase 的表可以包含大量的列,並且這些列可以根據需要動態添加,而無需預先定義嚴格的 Schema。
  • 表作為儲存單元:在 HBase 中,表格是數據儲存的基本單位。一個表由一個或多個列族 (Column Families) 組成。列族是 HBase 的一個重要概念,它將相關的列組織在一起,並在物理層面上進行數據的儲存和管理。
  • Schema-Free NoSQL 資料庫:HBase 被認為是一個 Schema-Free 的 NoSQL 資料庫。這意味著您不需要預先定義表格的所有列。您可以為每個行添加任意數量的列,只要它們屬於已定義的列族。
  • 基於 HDFS 的儲存:HBase 的所有數據都儲存在底層的 Hadoop 分散式檔案系統 (HDFS) 上。這使得 HBase 能夠繼承 HDFS 的高可用性、容錯性和擴展性。
  • 版本化數據:HBase 會自動為儲存的數據添加時間戳,實現數據的版本控制。這意味著您可以查詢特定時間點的數據,或者查看數據的歷史變更記錄。

環境準備與設定

要在 Docker 環境中運行 Apache HBase,需要進行以下準備工作:

  • Docker 安裝:確保您的系統已安裝 Docker。
  • CDH Docker 映像檔:我們將沿用先前章節中介紹的 svds/cdh Docker 映像檔。這個映像檔包含了 Apache HBase 以及其他 Hadoop 生態系統組件,為我們提供了一個方便的開發和測試環境。
  • SSH 連接:如果是在雲端環境中進行操作,需要使用 SSH 客戶端連接到遠端伺服器。

啟動 CDH 環境

在準備好 Docker 環境後,我們需要啟動一個包含 HBase 的 CDH Docker 容器。

  1. 啟動 CDH 容器: 使用以下命令啟動一個名為 cdh 的 CDH Docker 容器,並讓它在後台運行:

    sudo docker run -d --name cdh svds/cdh
    
  2. 進入容器互動式終端: 為了執行 HBase 命令,我們需要進入容器的終端環境。使用以下命令啟動一個交互式 Bash 會話:

    sudo docker exec -it cdh bash
    

啟動 HBase Shell

在容器的終端中,我們可以啟動 HBase 的互動式 Shell,這是與 HBase 進行交互的主要方式。

  1. 啟動 HBase Shell: 在容器內的終端中,執行以下命令來啟動 HBase Shell:
    hbase shell
    
    啟動後,您將看到 HBase Shell 的提示符,通常是 hbase(main):001:0>

創建 HBase 表格

在 HBase Shell 中,可以使用 create 命令來創建新的表格。創建表格時,需要指定表格名稱以及至少一個列族。

後續操作

本章節後續將涵蓋列出 HBase 表格、獲取單行數據、獲取單行特定列數據,以及掃描表格等操作,讓您全面了解 HBase 的基本數據操作能力。最後,我們將學習如何停止 CDH Docker 容器。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

object "使用者" as User
object "Docker Daemon" as DockerDaemon
object "CDH Docker Image" as CDHImage
object "CDH Container (cdh)" as CDHContainer
object "HBase Shell" as HBASE_SHELL
object "HBase Master/RegionServer" as HBase_Service
object "HDFS" as HDFS

partition "環境準備與啟動" {
  User --> DockerDaemon : 執行 docker pull svds/cdh
  DockerDaemon --> CDHImage : 下載映像檔
  User --> DockerDaemon : 執行 docker run -d --name cdh svds/cdh
  DockerDaemon --> CDHContainer : 啟動 CDH 容器
  User --> DockerDaemon : 執行 docker exec -it cdh bash
  DockerDaemon --> CDHContainer : 進入容器終端
}

partition "HBase 操作" {
  User --> CDHContainer : 執行 hbase shell
  CDHContainer --> HBASE_SHELL : 啟動 HBase 互動式 Shell
  User --> HBASE_SHELL : 輸入 hbase 命令 (create, list, get, scan...)
  HBASE_SHELL --> HBase_Service : 發送 HBase 操作請求
  HBase_Service --> HDFS : 讀寫 HBase 表格數據
  HBase_Service --> HBASE_SHELL : 返回操作結果
  HBase_Service --> User : 顯示操作結果
}

partition "核心概念與架構" {
  CDHContainer --> HBase_Service : 運行 HBase 服務
  HBase_Service --> HDFS : 儲存 HBase 表格數據
  HBase_Service --> User : 提供 Schema-Free NoSQL 接口
}

partition "資源釋放" {
  User --> DockerDaemon : 執行 docker stop cdh (在宿主機)
  DockerDaemon --> CDHContainer : 停止 CDH 容器
}

@enduml

看圖說話:

此圖示概述了使用 Apache HBase 的基本流程與架構。首先,它展示了如何準備 Docker 環境,包括下載 svds/cdh 映像檔、啟動 CDH 容器,並進入容器的終端。接著,圖示描繪了進入 HBase Shell 的過程,這是與 HBase 進行互動的主要介面。隨後,它展示了使用者通過 HBase Shell 輸入各種命令(如 create, list, get, scan),這些命令被發送到 HBase 服務(包括 Master 和 RegionServer),然後 HBase 服務負責在底層的 HDFS 上讀寫數據。圖示也強調了 HBase 的核心概念,即它是一個運行在 HDFS 上的 Schema-Free NoSQL 資料庫。最後,圖示標示了如何停止 CDH 容器以釋放資源。整體而言,該圖示為理解 HBase 的基本操作、架構以及與 Docker 的整合提供了一個清晰的概覽。

縱觀現代企業在數據架構上的多元挑戰,Apache Hive 與 HBase 的選擇,不僅是技術路徑的分歧,更是對數據價值實現方式的策略定位。兩者的操作實踐清晰地展示了巨量資料生態系中兩種截然不同的設計哲學,理解其差異是數據策略決策者的核心修養。

透過多維度比較分析,Hive 承襲了傳統數據倉儲的思維典範,將結構化查詢(SQL)的便利性延伸至巨量數據的批次分析,是商業智慧與週期性報表產出的堅實後盾。然而,其基於 MapReduce 的內在延遲,使其難以應對即時查詢需求,這是其應用場景的天然瓶頸。相對地,HBase 作為 NoSQL 的代表,提供的是針對海量非結構化數據的低延遲、高併發讀寫能力。這種從「為分析而生」到「為應用而生」的價值轉變,揭示了兩者在架構定位上的根本差異。

展望未來,兩者並非零和競爭,而是走向協同演進。在成熟的數據平台中,由 Hive 負責的「批次層」(Batch Layer)與 HBase 支撐的「服務層」(Serving Layer)共存,形成數據處理的完整迴路。數據經由批次處理沉澱為深度洞察,再由即時系統提供快速存取,這種整合架構將是企業釋放數據資產全部潛力的關鍵。

玄貓認為,對於數據策略的決策者而言,真正的挑戰不在於精通單一工具的語法,而在於精準判斷業務問題的本質。是以「分析過去」為核心,還是以「驅動當下」為目標,這個根本性的提問,將直接決定 Hive 與 HBase 在您技術藍圖中的最終位置。