聊聊 HBase

文章最後更新於 2023 年 2 月 15 日

以下是跟AI聊聊HBase的一些筆記

什麼是 HBase?

HBase 是一個分散式、欄位導向、非關聯式資料庫系統,可以在 Apache Hadoop 之上運行。它是設計用來管理大量的結構化資料,並提供低延遲的讀寫存取。HBase 的資料儲存是欄位導向的,意思是資料會以行為單位儲存,且每一行可以有許多不同的欄位。

HBase 可以透過 Hadoop 的 MapReduce 框架來進行大規模的資料處理。它也有一個叫做 HBase Shell 的命令列介面,可以讓使用者透過命令來存取和管理資料庫。HBase 有許多可以使用的 API,包括 Java、Scala、Python 和 Ruby 等,可以讓開發者輕鬆地將 HBase 連接到他們的應用程式中。此外,HBase 也支援 Thrift 和 RESTful 等不同的網路協定,可以讓使用者透過網路存取資料庫。

HBase 官方網站為 https://hbase.apache.org/

為什麼要用 HBase?

HBase 的優點包括高可靠性、高可擴展性、低延遲讀寫存取和豐富的功能。它可以處理海量的資料,並且可以提供快速的讀寫存取。如果你正在尋找一個可以幫助你處理海量資料的資料庫系統,HBase 可能是個不錯的選擇。

HBase 與 Hadoop/HDFS 有什麼不同?

HDFS 是一個分佈式文件系統,很適合存儲大文件。然而,它的文檔指出,它不是一個通用的文件系統,並且不提供快速的文件中的單個記錄查詢。另一方面,HBase 是建立在 HDFS 之上的,並為大表提供快速的記錄查詢(和更新)。這有時會成為一個概念上的混淆點。 HBase 在內部將你的數據放在存在於 HDFS 上的有索引的 “StoreFiles “中,用於高速查詢。

什麼時候會用到 HBase?

HBase並不適合用來解決每個問題。

首先,要確保你有足夠的數據。如果你有數以億計或數十億計的行,那麼 HBase 就是一個很好的選擇。如果你只有幾千/幾百萬行,那麼使用傳統的 RDBMS 可能是一個更好的選擇,因為你的所有數據可能都在一個(或兩個)節點上,而集群的其他部分可能處於閒置狀態。

第二,確保你可以不使用 RDBMS 提供的所有額外功能(如類型化列、二級索引、事務、高級查詢語言等)。例如,針對 RDBMS 構建的應用程序不能通過簡單地改變 JDBC 驅動程序來 “移植 “到 HBase。考慮從 RDBMS 轉移到 HBase 是一個完整的重新設計,而不是一個移植。

第三,確保你有足夠的硬件。即使是 HDFS,如果少於5個數據節點(由於HDFS的塊複製默認為3個),再加上一個NameNode,也不會有好的效果。

HBase可以很好地在筆記本電腦上獨立運行–但這應該被視為一種開發配置。

什麼地方會用到HBase?

HBase 常常被用在需要高度可擴展性和低延遲讀寫存取的應用程式中。例如,可以用 HBase 來建立大型的聊天軟體、社交網路平台、遊戲伺服器、物聯網應用程式等。

還有,HBase 也常常被用在資料分析和商業智慧的應用程式中。例如,可以用 HBase 來儲存大量的交易資料,並利用 Hadoop 的 MapReduce 框架來進行大規模的資料處理,以分析出商業洞察。

总的來說,HBase 可以用在許多不同的場合,包括大型的聊天軟體、社交網路平台、遊戲伺服器、物聯網應用程式、資料分析和商業智慧等。它可以幫助使用者處理海量資料並提供快速的讀寫存取。

如何使用HBase?

HBase 有許多可以使用的 API,包括 Java、Scala、Python 和 Ruby 等,可以讓開發者輕鬆地將 HBase 連接到他們的應用程式中。此外,HBase 也支援 Thrift 和 RESTful 等不同的網路協定,可以讓使用者透過網路存取資料庫。

如果你想要使用 HBase,首先需要安裝和設定 Hadoop 和 HBase。然後,你可以使用 HBase Shell 命令列介面來存取和管理資料庫,或者使用 HBase 的 API 來連接到你的應用程式中。

HBase 有許多不同的操作,包括建立表格、新增、修改和刪除資料、以及查詢和分析資料等。你可以參考 HBase 的文件和教學課程,了解更多有關如何使用 HBase 的資訊。

使用HBase要注意什麼?

使用 HBase 有一些注意事項,包括:

  1. HBase 的資料儲存是欄位導向的,意思是資料會以行為單位儲存,且每一行可以有許多不同的欄位。所以,在使用 HBase 之前,你需要先確定你的資料模型,並且決定哪些欄位需要存在哪些行中。
  2. HBase 是分散式的資料庫系統,所以你需要注意資料的分散方式。例如,你可以使用 HBase 的分散式設定,或者自己寫一個分散式程式來平均分散資料。
  3. HBase 的讀寫存取是有延遲的,所以你需要注意讀寫存取的效能。你可以使用 HBase 的儲存體優化功能,或者自己寫一些優化程式來提升讀寫存取的效能。
  4. HBase 也有一些限制,包括資料大小的限制和資料型態的限制。你需要注意這些限制,以避免在使用 HBase 時遇到問題。
  5. HBase 的資料儲存是欄位導向的,意思是資料會以行為單位儲存,且每一行可以有許多不同的欄位。所以,你需要注意行鍵的設計。行鍵是用來區分不同行的唯一識別碼,必須是唯一的。
  6. HBase 支援 ACID 事務,但是 ACID 事務有一些限制,例如只能在同一個表格內進行,並且不支援跨表格的事務。所以,你需要注意 ACID 事務的使用方式,以避免出現問題。
  7. HBase 支援多種不同的查詢方式,包括精確查詢、前綴查詢、范圍查詢和正規表達式查詢等。你需要根據你的需求來選擇合適的查詢方式。

總結來說,使用 HBase 需要注意資料的分散方式、讀寫存取的效能、限制、行鍵的設計、ACID 事務的使用方式和查詢方式等。如果你能夠注意這些事項,那麼你就可以順利地使用 HBase 了。

HBase 常用指令

以下是 HBASE 常用指令:

  1. hbase shell: 進入 HBase shell 模式。
  2. status ‘simple’: 查看 HBase 的狀態。
  3. create ‘table_name’, ‘column_family_1’, ‘column_family_2’, …: 建立新表。
  4. list: 列出所有表。
  5. describe ‘table_name’: 查看表的詳細資訊。
  6. disable ‘table_name’: 禁用表。
  7. enable ‘table_name’: 啟用表。
  8. drop ‘table_name’: 刪除表。
  9. put ‘table_name’, ‘row_key’, ‘column_family:column’, ‘value’: 向表中插入一行數據。
  10. get ‘table_name’, ‘row_key’: 查詢某一行數據。
  11. scan ‘table_name’: 查詢整個表的數據。
  12. delete ‘table_name’, ‘row_key’, ‘column_family:column’: 刪除行中的某一列。
  13. truncate ‘table_name’: 清空表。

HBase Java 程式範例

這裡是一個用Java編寫的簡單範例程式,展示如何創建HBase表格、向表格中添加數據並從表格中檢索數據。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.util.Bytes;

public class HBaseExample {

   public static void main(String[] args) throws Exception {

      // 創建HBase配置對象
      Configuration config = HBaseConfiguration.create();

      // 設置ZK quorum地址(請替換為實際的HBase quorum地址)
      config.set("hbase.zookeeper.quorum", "localhost");

      // 創建到HBase集群的連接
      Connection connection = ConnectionFactory.createConnection(config);

      // 創建管理HBase操作的管理員對象
      Admin admin = connection.getAdmin();

      // 為要創建的表創建表描述符對象
      TableName tableName = TableName.valueOf("mytable");
      TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);

      // 為表描述符添加列族
      ColumnFamilyDescriptorBuilder columnDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("mycolumnfamily"));
      ColumnFamilyDescriptor columnDescriptor = columnDescriptorBuilder.build();
      tableDescriptorBuilder.setColumnFamily(columnDescriptor);

      // 使用表描述符對象創建表格
      TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
      admin.createTable(tableDescriptor);

      // 獲取要添加數據的表格實例(請替換為實際的表格名稱)
      Table table = connection.getTable(tableName);

      // 創建一個新的Put對象,其中包含要添加的行鍵和列族及列值
      Put put = new Put(Bytes.toBytes("rowkey1"));
      put.addColumn(Bytes.toBytes("mycolumnfamily"), Bytes.toBytes("mycolumn"), Bytes.toBytes("myvalue"));

      // 將Put對象添加到表格中
      table.put(put);

      // 創建一個新的Get對象,其中包含要從表格中檢索數據的行鍵
      Get get = new Get(Bytes.toBytes("rowkey1"));

      // 使用Get對象從表格中檢索結果
      Result result = table.get(get);

      // 使用列族和列名從結果中獲取值
      byte[] value = result.getValue(Bytes.toBytes("mycolumnfamily"), Bytes.toBytes("mycolumn"));

      // 印出這個值
      System.out.println(Bytes.toString(value));

      // 關閉連接、管理員和表格對象
      table.close();
      admin.close();
      connection.close();
   }
}

範例程式展示了如何使用Java API在HBase中創建表格、添加數據和檢索數據。程式中,首先創建一個到HBase集群的連接,然後使用管理員對象創建一個表格描述符對象,為要創建的表格添加列族,使用表描述符對象創建表格。

接著,程式使用表格實例對象創建一個新的Put對象,其中包含要添加的行鍵和列族及列值,並將Put對象添加到表格中。然後,程式使用Get對象從表格中檢索數據,使用列族和列名從結果中獲取值,並印出這個值。

最後,程式關閉連接、管理員和表格對象。

需要注意的是,程式中的HBase quorum地址應該替換為實際的HBase quorum地址,表格名稱和列族名稱也應該根據實際情況進行修改。

關於作者

卡哥
卡哥
我是Oscar (卡哥),前Yahoo Lead Engineer、高智商同好組織Mensa會員,超過十年的工作經驗,服務過Yahoo關鍵字廣告業務部門、電子商務及搜尋部門,喜歡彈吉他玩音樂,也喜歡投資美股、虛擬貨幣,樂於與人分享交流!

如果對文章內容有任何問題,歡迎在底下留言讓我知道。
如果你喜歡我的文章,可以按分享按鈕,讓更多的人看見我的文章。

網友留言