HBase 快速指南



HBase - 概述

自1970年以來,關係資料庫管理系統 (RDBMS) 一直是解決資料儲存和維護相關問題的方案。在大資料出現後,公司意識到處理大資料的益處,並開始選擇 Hadoop 等解決方案。

Hadoop 使用分散式檔案系統來儲存大資料,並使用 MapReduce 來處理它。Hadoop 擅長儲存和處理各種格式的海量資料,例如任意、半結構化甚至非結構化資料。

Hadoop 的侷限性

Hadoop 只能執行批處理,並且只能以順序方式訪問資料。這意味著即使對於最簡單的作業,也必須搜尋整個資料集。

處理海量資料集時會產生另一個海量資料集,也必須順序處理。此時,需要一種新的解決方案來在單個時間單位內訪問資料的任何點(隨機訪問)。

Hadoop 隨機訪問資料庫

HBase、Cassandra、CouchDB、Dynamo 和 MongoDB 等應用程式是一些儲存海量資料並以隨機方式訪問資料的資料庫。

什麼是 HBase?

HBase 是一個構建在 Hadoop 檔案系統之上的分散式列式資料庫。它是一個開源專案,並且具有水平可擴充套件性。

HBase 是一種與 Google 的 Bigtable 類似的資料模型,旨在提供對海量結構化資料的快速隨機訪問。它利用 Hadoop 分散式檔案系統 (HDFS) 提供的容錯能力。

它是 Hadoop 生態系統的一部分,它提供對 Hadoop 檔案系統中資料的隨機即時讀/寫訪問。

可以直接或透過 HBase 將資料儲存在 HDFS 中。資料使用者使用 HBase 以隨機方式讀取/訪問 HDFS 中的資料。HBase 位於 Hadoop 檔案系統之上,並提供讀寫訪問。

HBase Flow

HBase 和 HDFS

HDFS HBase
HDFS 是一個適合儲存大型檔案的分散式檔案系統。 HBase 是構建在 HDFS 之上的資料庫。
HDFS 不支援快速單個記錄查詢。 HBase 為大型表提供快速查詢。
它提供高延遲批處理;沒有批處理的概念。 它提供對數十億條記錄中單行的低延遲訪問(隨機訪問)。
它只提供資料的順序訪問。 HBase 內部使用雜湊表並提供隨機訪問,它將資料儲存在索引的 HDFS 檔案中以加快查詢速度。

HBase 中的儲存機制

HBase 是一個列式資料庫,其中的表按行排序。表模式僅定義列族,它們是鍵值對。一個表可以有多個列族,每個列族可以有任意數量的列。後續的列值連續儲存在磁碟上。表的每個單元格值都有一個時間戳。簡而言之,在 HBase 中

  • 表是行的集合。
  • 行是列族的集合。
  • 列族是列的集合。
  • 列是鍵值對的集合。

下面是 HBase 表的示例模式。

Rowid 列族 列族 列族 列族
col1 col2 col3 col1 col2 col3 col1 col2 col3 col1 col2 col3
1
2
3

列式和行式

列式資料庫是指將資料表儲存為資料列的節,而不是資料的行。簡而言之,它們將具有列族。

行式資料庫 列式資料庫
它適用於聯機事務處理 (OLTP)。 它適用於聯機分析處理 (OLAP)。
此類資料庫設計用於少量行和列。 列式資料庫設計用於大型表。

下圖顯示了列式資料庫中的列族

Table

HBase 和 RDBMS

HBase RDBMS
HBase 是無模式的,它沒有固定列模式的概念;只定義列族。 RDBMS 受其模式的約束,該模式描述表的整個結構。
它構建用於寬表。HBase 是水平可擴充套件的。 它很薄,專為小型表而構建。難以擴充套件。
HBase 中沒有事務。 RDBMS 是事務性的。
它具有非規範化資料。 它將具有規範化資料。
它適用於半結構化資料和結構化資料。 它適用於結構化資料。

HBase 的特性

  • HBase 具有線性可擴充套件性。
  • 它具有自動故障支援。
  • 它提供一致的讀寫。
  • 它與 Hadoop 整合,既作為源也作為目標。
  • 它具有簡單的 Java 客戶端 API。
  • 它提供跨叢集的資料複製。

HBase 的使用場景

  • Apache HBase 用於對大資料進行隨機、即時的讀/寫訪問。

  • 它在商用硬體叢集之上託管超大型表。

  • Apache HBase 是一個非關係資料庫,其模型參考了 Google 的 Bigtable。Bigtable 執行在 Google 檔案系統上,同樣,Apache HBase 執行在 Hadoop 和 HDFS 之上。

HBase 的應用

  • 每當需要編寫重量級應用程式時,都可以使用它。
  • 每當我們需要對可用資料提供快速隨機訪問時,就使用 HBase。
  • Facebook、Twitter、Yahoo 和 Adobe 等公司在內部使用 HBase。

HBase 歷史

年份 事件
2006年11月 Google 釋出了關於 BigTable 的論文。
2007年2月 作為 Hadoop 的貢獻,建立了最初的 HBase 原型。
2007年10月 第一個可用的 HBase 與 Hadoop 0.15.0 一起釋出。
2008年1月 HBase 成為 Hadoop 的子專案。
2008年10月 HBase 0.18.1 釋出。
2009年1月 HBase 0.19.0 釋出。
2009年9月 HBase 0.20.0 釋出。
2010年5月 HBase 成為 Apache 頂級專案。

HBase - 架構

在 HBase 中,表被分割成區域,並由區域伺服器提供服務。區域被列族垂直劃分為“儲存”。儲存作為檔案儲存在 HDFS 中。下圖顯示了 HBase 的架構。

注意:術語“儲存”用於解釋區域的儲存結構。

HBase Architecture

HBase 有三個主要元件:客戶端庫、主伺服器和區域伺服器。可以根據需要新增或刪除區域伺服器。

主伺服器

主伺服器 -

  • 將區域分配給區域伺服器,併為此任務藉助 Apache ZooKeeper。

  • 處理跨區域伺服器的區域負載均衡。它解除安裝繁忙的伺服器並將區域轉移到佔用率較低的伺服器。

  • 透過協商負載均衡來維護叢集的狀態。

  • 負責模式更改和其他元資料操作,例如建立表和列族。

區域

區域只不過是分割並分佈在區域伺服器上的表。

區域伺服器

區域伺服器具有以下區域 -

  • 與客戶端通訊並處理與資料相關的操作。
  • 處理其下所有區域的讀寫請求。
  • 透過遵循區域大小閾值來確定區域的大小。

當我們深入研究區域伺服器時,它包含如下所示的區域和儲存

Regional Server

儲存包含記憶體儲存和 HFile。Memstore 就像快取記憶體一樣。最初輸入 HBase 的任何內容都儲存在這裡。稍後,資料將被傳輸並儲存到 HFile 中作為塊,並且 memstore 將被重新整理。

ZooKeeper

  • ZooKeeper 是一個開源專案,它提供維護配置資訊、命名、提供分散式同步等服務。

  • ZooKeeper 具有表示不同區域伺服器的短暫節點。主伺服器使用這些節點來發現可用的伺服器。

  • 除了可用性之外,這些節點還用於跟蹤伺服器故障或網路分割槽。

  • 客戶端透過 ZooKeeper 與區域伺服器通訊。

  • 在偽分散式和獨立模式下,HBase 本身將負責 ZooKeeper。

HBase - 安裝

本章解釋瞭如何安裝和初始配置 HBase。需要 Java 和 Hadoop 才能繼續使用 HBase,因此您必須在系統中下載和安裝 Java 和 Hadoop。

預安裝設定

在將 Hadoop 安裝到 Linux 環境之前,我們需要使用ssh(安全外殼)設定 Linux。請按照以下步驟設定 Linux 環境。

建立使用者

首先,建議為 Hadoop 建立一個單獨的使用者,以將 Hadoop 檔案系統與 Unix 檔案系統隔離。請按照以下步驟建立使用者。

  • 使用命令“su”開啟 root。
  • 使用命令“useradd 使用者名稱”從 root 帳戶建立使用者。
  • 現在,您可以使用命令“su 使用者名稱”開啟現有使用者帳戶。

開啟 Linux 終端並鍵入以下命令以建立使用者。

$ su
password:
# useradd hadoop
# passwd hadoop
New passwd:
Retype new passwd

SSH 設定和金鑰生成

SSH 設定是執行叢集上不同操作(例如啟動、停止和分散式守護程序 shell 操作)所必需的。為了對 Hadoop 的不同使用者進行身份驗證,需要為 Hadoop 使用者提供公鑰/私鑰對,並與不同的使用者共享。

以下命令用於使用 SSH 生成鍵值對。將公鑰從 id_rsa.pub 複製到 authorized_keys,並分別為 authorized_keys 檔案提供所有者、讀取和寫入許可權。

$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

驗證 ssh

ssh localhost

安裝 Java

Java 是 Hadoop 和 HBase 的主要先決條件。首先,您應該使用“java -version”驗證系統中 Java 的存在。java 版本命令的語法如下所示。

$ java -version

如果一切正常,它將提供以下輸出。

java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)

如果系統中未安裝 Java,則按照以下步驟安裝 Java。

步驟 1

透過訪問以下連結下載 Java(JDK <最新版本> - X64.tar.gz)Oracle Java

然後jdk-7u71-linux-x64.tar.gz 將下載到您的系統中。

步驟 2

通常,您會在“下載”資料夾中找到下載的 Java 檔案。驗證它並使用以下命令解壓縮jdk-7u71-linux-x64.gz 檔案。

$ cd Downloads/
$ ls
jdk-7u71-linux-x64.gz

$ tar zxf jdk-7u71-linux-x64.gz
$ ls
jdk1.7.0_71 jdk-7u71-linux-x64.gz

步驟 3

為了使 Java 可供所有使用者使用,您必須將其移動到“/usr/local/”位置。開啟 root 並鍵入以下命令。

$ su
password:
# mv jdk1.7.0_71 /usr/local/
# exit

步驟 4

為了設定PATHJAVA_HOME 變數,請將以下命令新增到~/.bashrc 檔案中。

export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH= $PATH:$JAVA_HOME/bin

現在將所有更改應用到當前執行的系統中。

$ source ~/.bashrc

步驟 5

使用以下命令配置 Java 替代項

# alternatives --install /usr/bin/java java usr/local/java/bin/java 2

# alternatives --install /usr/bin/javac javac usr/local/java/bin/javac 2

# alternatives --install /usr/bin/jar jar usr/local/java/bin/jar 2


# alternatives --set java usr/local/java/bin/java

# alternatives --set javac usr/local/java/bin/javac

# alternatives --set jar usr/local/java/bin/jar

現在,如上所述,從終端驗證java -version命令。

下載 Hadoop

安裝 Java 後,您需要安裝 Hadoop。首先,使用以下所示的“Hadoop version”命令驗證 Hadoop 是否存在。

hadoop version

如果一切正常,它將提供以下輸出。

Hadoop 2.6.0
Compiled by jenkins on 2014-11-13T21:10Z
Compiled with protoc 2.5.0
From source with checksum 18e43357c8f927c0695f1e9522859d6a
This command was run using
/home/hadoop/hadoop/share/hadoop/common/hadoop-common-2.6.0.jar

如果您的系統無法找到 Hadoop,則需要下載 Hadoop。請按照以下命令進行操作。

使用以下命令從 Apache 軟體基金會下載並解壓hadoop-2.6.0

$ su
password:
# cd /usr/local
# wget http://mirrors.advancedhosters.com/apache/hadoop/common/hadoop-
2.6.0/hadoop-2.6.0-src.tar.gz
# tar xzf hadoop-2.6.0-src.tar.gz
# mv hadoop-2.6.0/* hadoop/
# exit

安裝 Hadoop

您可以以任何所需的模式安裝 Hadoop。這裡,我們演示的是偽分散式模式下的 HBase 功能,因此請以偽分散式模式安裝 Hadoop。

安裝Hadoop 2.4.1的步驟如下:

步驟 1 - 設定 Hadoop

您可以透過將以下命令新增到~/.bashrc檔案中來設定 Hadoop 環境變數。

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_INSTALL=$HADOOP_HOME

現在將所有更改應用到當前執行的系統中。

$ source ~/.bashrc

步驟 2 - Hadoop 配置

您可以在“$HADOOP_HOME/etc/hadoop”位置找到所有 Hadoop 配置檔案。您需要根據您的 Hadoop 基礎架構更改這些配置檔案。

$ cd $HADOOP_HOME/etc/hadoop

為了用 Java 開發 Hadoop 程式,您必須透過將JAVA_HOME值替換為系統中 Java 的位置來重置hadoop-env.sh檔案中的 Java 環境變數。

export JAVA_HOME=/usr/local/jdk1.7.0_71

您需要編輯以下檔案來配置 Hadoop。

core-site.xml

core-site.xml檔案包含諸如 Hadoop 例項使用的埠號、為檔案系統分配的記憶體、儲存資料的記憶體限制以及讀/寫緩衝區大小等資訊。

開啟 core-site.xml 並將以下屬性新增到<configuration>和</configuration>標籤之間。

<configuration>
   <property>
      <name>fs.default.name</name>
      <value>hdfs://:9000</value>
   </property>
</configuration>

hdfs-site.xml

hdfs-site.xml檔案包含諸如複製資料的值、namenode 路徑以及您希望儲存 Hadoop 基礎架構的本地檔案系統的 datanode 路徑等資訊。

讓我們假設以下資料。

dfs.replication (data replication value) = 1
(In the below given path /hadoop/ is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)

namenode path = //home/hadoop/hadoopinfra/hdfs/namenode
(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)

datanode path = //home/hadoop/hadoopinfra/hdfs/datanode

開啟此檔案,並將以下屬性新增到<configuration>和</configuration>標籤之間。

<configuration>
   <property>
      <name>dfs.replication</name >
      <value>1</value>
   </property>
	
   <property>
      <name>dfs.name.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/namenode</value>
   </property>
	
   <property>
      <name>dfs.data.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/datanode</value>
   </property>
</configuration>

注意:在以上檔案中,所有屬性值都是使用者定義的,您可以根據您的 Hadoop 基礎架構進行更改。

yarn-site.xml

此檔案用於將 yarn 配置到 Hadoop 中。開啟 yarn-site.xml 檔案,並將以下屬性新增到此檔案中的<configuration>和</configuration>標籤之間。

<configuration>
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
   </property>
</configuration>

mapred-site.xml

此檔案用於指定我們正在使用哪個 MapReduce 框架。預設情況下,Hadoop 包含 yarn-site.xml 的模板。首先,需要使用以下命令將檔案從mapred-site.xml.template複製到mapred-site.xml檔案。

$ cp mapred-site.xml.template mapred-site.xml

開啟mapred-site.xml檔案,並將以下屬性新增到<configuration>和</configuration>標籤之間。

<configuration>
   <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>
</configuration>

驗證 Hadoop 安裝

驗證 Hadoop 安裝的步驟如下:

步驟 1 - Name Node 設定

使用命令“hdfs namenode -format”設定 namenode,如下所示。

$ cd ~
$ hdfs namenode -format

預期結果如下所示。

10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to
retain 1 images with txid >= 0
10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************/

步驟 2 - 驗證 Hadoop dfs

以下命令用於啟動 dfs。執行此命令將啟動您的 Hadoop 檔案系統。

$ start-dfs.sh

預期輸出如下所示。

10/24/14 21:37:56
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-namenode-localhost.out
localhost: starting datanode, logging to /home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]

步驟 3 - 驗證 Yarn 指令碼

以下命令用於啟動 yarn 指令碼。執行此命令將啟動您的 yarn 守護程序。

$ start-yarn.sh

預期輸出如下所示。

starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop-
2.4.1/logs/yarn-hadoop-resourcemanager-localhost.out
localhost: starting nodemanager, logging to /home/hadoop/hadoop-
2.4.1/logs/yarn-hadoop-nodemanager-localhost.out

步驟 4 - 在瀏覽器上訪問 Hadoop

訪問 Hadoop 的預設埠號為 50070。使用以下 URL 在瀏覽器上獲取 Hadoop 服務。

https://:50070

Hadoop on Browser

步驟 5 - 驗證叢集的所有應用程式

訪問叢集所有應用程式的預設埠號為 8088。使用以下 URL 訪問此服務。

https://:8088/

Hadoop Applicatin Cluster

安裝 HBase

我們可以以三種模式中的任何一種安裝 HBase:獨立模式、偽分散式模式和完全分散式模式。

以獨立模式安裝 HBase

使用“wget”命令從http://www.interior-dsgn.com/apache/hbase/stable/下載最新穩定版本的 HBase,並使用 tar “zxvf”命令解壓它。請參見以下命令。

$cd usr/local/
$wget http://www.interior-dsgn.com/apache/hbase/stable/hbase-0.98.8-
hadoop2-bin.tar.gz
$tar -zxvf hbase-0.98.8-hadoop2-bin.tar.gz

切換到超級使用者模式並將 HBase 資料夾移動到 /usr/local,如下所示。

$su
$password: enter your password here
mv hbase-0.99.1/* Hbase/

以獨立模式配置 HBase

在繼續使用 HBase 之前,您必須編輯以下檔案並配置 HBase。

hbase-env.sh

設定 HBase 的 Java 主目錄,並從 conf 資料夾中開啟hbase-env.sh檔案。編輯 JAVA_HOME 環境變數並將現有路徑更改為當前 JAVA_HOME 變數,如下所示。

cd /usr/local/Hbase/conf
gedit hbase-env.sh

這將開啟 HBase 的 env.sh 檔案。現在,將現有的JAVA_HOME值替換為您的當前值,如下所示。

export JAVA_HOME=/usr/lib/jvm/java-1.7.0

hbase-site.xml

這是 HBase 的主要配置檔案。透過開啟 /usr/local/HBase 中的 HBase 主目錄來將資料目錄設定為適當的位置。在 conf 資料夾中,您會找到幾個檔案,開啟hbase-site.xml檔案,如下所示。

#cd /usr/local/HBase/
#cd conf
# gedit hbase-site.xml

hbase-site.xml檔案中,您會找到<configuration>和</configuration>標籤。在它們內部,使用名為“hbase.rootdir”的屬性鍵設定 HBase 目錄,如下所示。

<configuration>
   //Here you have to set the path where you want HBase to store its files.
   <property>
      <name>hbase.rootdir</name>
      <value>file:/home/hadoop/HBase/HFiles</value>
   </property>
	
   //Here you have to set the path where you want HBase to store its built in zookeeper  files.
   <property>
      <name>hbase.zookeeper.property.dataDir</name>
      <value>/home/hadoop/zookeeper</value>
   </property>
</configuration>

這樣,HBase 的安裝和配置部分就完成了。我們可以使用 HBase 的 bin 資料夾中提供的start-hbase.sh指令碼啟動 HBase。為此,請開啟 HBase 主目錄並執行 HBase 啟動指令碼,如下所示。

$cd /usr/local/HBase/bin
$./start-hbase.sh

如果一切順利,當您嘗試執行 HBase 啟動指令碼時,它會提示您一條訊息,說明 HBase 已啟動。

starting master, logging to /usr/local/HBase/bin/../logs/hbase-tpmaster-localhost.localdomain.out

以偽分散式模式安裝 HBase

現在讓我們檢查如何在偽分散式模式下安裝 HBase。

配置 HBase

在繼續使用 HBase 之前,請在本地系統或遠端系統上配置 Hadoop 和 HDFS,並確保它們正在執行。如果 HBase 正在執行,請停止它。

hbase-site.xml

編輯 hbase-site.xml 檔案以新增以下屬性。

<property>
   <name>hbase.cluster.distributed</name>
   <value>true</value>
</property>

它將提到 HBase 應該以哪種模式執行。在本地檔案系統中的同一檔案中,使用 hdfs://// URI 語法更改 hbase.rootdir 和您的 HDFS 例項地址。我們正在 8030 埠的 localhost 上執行 HDFS。

<property>
   <name>hbase.rootdir</name>
   <value>hdfs://:8030/hbase</value>
</property>

啟動 HBase

配置完成後,瀏覽到 HBase 主目錄並使用以下命令啟動 HBase。

$cd /usr/local/HBase
$bin/start-hbase.sh

注意:啟動 HBase 之前,請確保 Hadoop 正在執行。

檢查 HDFS 中的 HBase 目錄

HBase 在 HDFS 中建立其目錄。要檢視已建立的目錄,請瀏覽到 Hadoop bin 並鍵入以下命令。

$ ./bin/hadoop fs -ls /hbase

如果一切順利,它將為您提供以下輸出。

Found 7 items
drwxr-xr-x - hbase users 0 2014-06-25 18:58 /hbase/.tmp
drwxr-xr-x - hbase users 0 2014-06-25 21:49 /hbase/WALs
drwxr-xr-x - hbase users 0 2014-06-25 18:48 /hbase/corrupt
drwxr-xr-x - hbase users 0 2014-06-25 18:58 /hbase/data
-rw-r--r-- 3 hbase users 42 2014-06-25 18:41 /hbase/hbase.id
-rw-r--r-- 3 hbase users 7 2014-06-25 18:41 /hbase/hbase.version
drwxr-xr-x - hbase users 0 2014-06-25 21:49 /hbase/oldWALs

啟動和停止主伺服器

使用“local-master-backup.sh”,您可以啟動多達 10 個伺服器。開啟 HBase 的主目錄,master 並執行以下命令啟動它。

$ ./bin/local-master-backup.sh 2 4

要終止備份主伺服器,您需要其程序 ID,該 ID 將儲存在名為“/tmp/hbase-USER-X-master.pid”的檔案中。您可以使用以下命令終止備份主伺服器。

$ cat /tmp/hbase-user-1-master.pid |xargs kill -9

啟動和停止 RegionServers

您可以使用以下命令從單個系統執行多個 region server。

$ .bin/local-regionservers.sh start 2 3

要停止 region server,請使用以下命令。

$ .bin/local-regionservers.sh stop 3

 

啟動 HBase Shell

成功安裝 HBase 後,您可以啟動 HBase Shell。以下是啟動 HBase shell 的步驟序列。開啟終端,並以超級使用者身份登入。

啟動 Hadoop 檔案系統

瀏覽 Hadoop 主目錄 sbin 資料夾並啟動 Hadoop 檔案系統,如下所示。

$cd $HADOOP_HOME/sbin
$start-all.sh

啟動 HBase

瀏覽 HBase 根目錄 bin 資料夾並啟動 HBase。

$cd /usr/local/HBase
$./bin/start-hbase.sh

啟動 HBase 主伺服器

這將是相同的目錄。啟動它,如下所示。

$./bin/local-master-backup.sh start 2 (number signifies specific
server.) 

啟動 Region

啟動 region server,如下所示。

$./bin/./local-regionservers.sh start 3

啟動 HBase Shell

您可以使用以下命令啟動 HBase shell。

$cd bin
$./hbase shell

這將為您提供如下所示的 HBase Shell 提示符。

2014-12-09 14:24:27,526 INFO [main] Configuration.deprecation:
hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.98.8-hadoop2, r6cfc8d064754251365e070a10a82eb169956d5fe, Fri
Nov 14 18:26:29 PST 2014

hbase(main):001:0>

HBase Web 介面

要訪問 HBase 的 Web 介面,請在瀏覽器中鍵入以下 URL。

https://:60010

此介面列出了您當前正在執行的 Region server、備份主伺服器和 HBase 表。

HBase Region server 和備份主伺服器

HBase Servers

HBase 表

HBase Tables

設定 Java 環境

我們還可以使用 Java 庫與 HBase 通訊,但在使用 Java API 訪問 HBase 之前,您需要為這些庫設定類路徑。

設定類路徑

在繼續程式設計之前,請在.bashrc檔案中設定 HBase 庫的類路徑。在任何編輯器中開啟.bashrc,如下所示。

$ gedit ~/.bashrc

在其中設定 HBase 庫(HBase 中的 lib 資料夾)的類路徑,如下所示。

export CLASSPATH = $CLASSPATH://home/hadoop/hbase/lib/*

這是為了防止在使用 Java API 訪問 HBase 時出現“類未找到”異常。

HBase - Shell

本章介紹如何啟動 HBase 互動式 shell,該 shell 附帶 HBase。

HBase Shell

HBase 包含一個 shell,您可以使用它與 HBase 通訊。HBase 使用 Hadoop 檔案系統來儲存其資料。它將擁有一個主伺服器和 region server。資料儲存將採用區域(表)的形式。這些區域將被分割並存儲在 region server 中。

主伺服器管理這些 region server,所有這些任務都在 HDFS 上進行。以下是 HBase Shell 支援的一些命令。

常規命令

  • status - 提供 HBase 的狀態,例如伺服器數量。

  • version - 提供正在使用的 HBase 版本。

  • table_help - 提供表引用命令的幫助。

  • whoami - 提供有關使用者的資訊。

資料定義語言

這些是在 HBase 中操作表的命令。

  • create - 建立表。

  • list - 列出 HBase 中的所有表。

  • disable - 停用表。

  • is_disabled - 驗證表是否被停用。

  • enable - 啟用表。

  • is_enabled - 驗證表是否已啟用。

  • describe - 提供表的描述。

  • alter - 更改表。

  • exists - 驗證表是否存在。

  • drop - 從 HBase 中刪除表。

  • drop_all - 刪除與命令中給定的“正則表示式”匹配的表。

  • Java Admin API - 在所有上述命令之前,Java 提供了一個 Admin API,可以透過程式設計實現 DDL 功能。在org.apache.hadoop.hbase.client包下,HBaseAdmin 和 HTableDescriptor 是此包中提供 DDL 功能的兩個重要類。

資料操縱語言

  • put - 將單元格值放在特定表中特定行中的指定列中。

  • get - 獲取行或單元格的內容。

  • delete - 刪除表中的單元格值。

  • deleteall - 刪除給定行中的所有單元格。

  • scan - 掃描並返回表資料。

  • count - 計數並返回表中的行數。

  • truncate - 停用、刪除和重新建立指定的表。

  • Java 客戶端 API - 在所有上述命令之前,Java 提供了一個客戶端 API,可以透過程式設計實現 DML 功能、CRUD(建立檢索更新刪除)操作以及更多功能,在 org.apache.hadoop.hbase.client 包下。HTable PutGet 是此包中的重要類。

啟動 HBase Shell

要訪問 HBase shell,您必須導航到 HBase 主目錄。

cd /usr/localhost/
cd Hbase

您可以使用“hbase shell”命令啟動HBase互動式shell,如下所示。

./bin/hbase shell

如果您已在系統中成功安裝HBase,則它會為您提供如下所示的HBase shell提示符。

HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.94.23, rf42302b28aceaab773b15f234aa8718fff7eea3c, Wed Aug 27
00:54:09 UTC 2014

hbase(main):001:0>

要隨時退出互動式shell命令,請鍵入exit或使用<ctrl+c>。在繼續操作之前,請檢查shell的功能。為此,請使用list命令。List命令用於獲取HBase中所有表的列表。首先,請使用此命令驗證系統中HBase的安裝和配置,如下所示。

hbase(main):001:0> list

鍵入此命令後,它會為您提供以下輸出。

hbase(main):001:0> list
TABLE

HBase - 常用命令

HBase中的常用命令包括status、version、table_help和whoami。本章將解釋這些命令。

status

此命令返回系統狀態,包括系統上執行的伺服器的詳細資訊。其語法如下:

hbase(main):009:0> status

如果您執行此命令,它將返回以下輸出。

hbase(main):009:0> status
3 servers, 0 dead, 1.3333 average load

version

此命令返回系統中使用的HBase版本。其語法如下:

hbase(main):010:0> version

如果您執行此命令,它將返回以下輸出。

hbase(main):009:0> version
0.98.8-hadoop2, r6cfc8d064754251365e070a10a82eb169956d5fe, Fri Nov 14
18:26:29 PST 2014

table_help

此命令指導您如何使用表相關命令。以下是使用此命令的語法:

hbase(main):02:0> table_help

使用此命令時,它將顯示錶相關命令的幫助主題。以下是此命令的部分輸出:

hbase(main):002:0> table_help
Help for table-reference commands.
You can either create a table via 'create' and then manipulate the table
via commands like 'put', 'get', etc.
See the standard help information for how to use each of these commands.
However, as of 0.96, you can also get a reference to a table, on which
you can invoke commands.
For instance, you can get create a table and keep around a reference to
it via:
 hbase> t = create 't', 'cf'…...

whoami

此命令返回HBase的使用者詳細資訊。如果您執行此命令,它將返回當前的HBase使用者,如下所示:

hbase(main):008:0> whoami
hadoop (auth:SIMPLE)
groups: hadoop

HBase - 管理員API

HBase是用Java編寫的,因此它提供Java API來與HBase通訊。Java API是與HBase通訊的最快方式。以下是涵蓋用於管理表的任務的參考Java Admin API。

類HBaseAdmin

HBaseAdmin是一個表示管理員的類。此類屬於org.apache.hadoop.hbase.client包。使用此類,您可以執行管理員的任務。您可以使用Connection.getAdmin()方法獲取Admin的例項。

方法和描述

序號 方法和描述
1

void createTable(HTableDescriptor desc)

建立一個新表。

2

void createTable(HTableDescriptor desc, byte[][] splitKeys)

建立一個新表,其中包含由指定的分割鍵定義的初始空區域集。

3

void deleteColumn(byte[] tableName, String columnName)

從表中刪除一列。

4

void deleteColumn(String tableName, String columnName)

從表中刪除一列。

5

void deleteTable(String tableName)

刪除一個表。

類Descriptor

此類包含有關HBase表的資訊,例如:

  • 所有列族的描述符;
  • 表是否是目錄表;
  • 表是否是隻讀的;
  • memstore的最大大小;
  • 何時應進行區域分割;
  • 與其關聯的協處理器等。

建構函式

序號 建構函式和摘要
1

HTableDescriptor(TableName name)

構造一個指定TableName物件的表描述符。

方法和描述

序號 方法和描述
1

HTableDescriptor addFamily(HColumnDescriptor family)

向給定的描述符新增一個列族。

HBase - 建立表

使用HBase Shell建立表

您可以使用create命令建立表,您必須在此處指定表名和列族名。在HBase shell中建立表的語法如下所示:

create ‘<table name>’,’<column family>’ 

示例

以下是名為emp表的示例模式。它有兩個列族:“個人資料”和“職業資料”。

行鍵 個人資料 職業資料

您可以在HBase shell中建立此表,如下所示:

hbase(main):002:0> create 'emp', 'personal data', 'professional data'

它將為您提供以下輸出。

0 row(s) in 1.1300 seconds
=> Hbase::Table - emp

驗證

您可以使用list命令驗證表是否已建立,如下所示。在這裡您可以看到已建立的emp表。

hbase(main):002:0> list
TABLE 
emp
2 row(s) in 0.0340 seconds

使用Java API建立表

您可以使用HBaseAdmin類的createTable()方法在HBase中建立表。此類屬於org.apache.hadoop.hbase.client包。以下是使用Java API在HBase中建立表的步驟。

步驟1:例項化HBaseAdmin

此類需要Configuration物件作為引數,因此最初例項化Configuration類並將此例項傳遞給HBaseAdmin。

Configuration conf = HBaseConfiguration.create();
HBaseAdmin admin = new HBaseAdmin(conf);

步驟2:建立TableDescriptor

HTableDescriptor是一個屬於org.apache.hadoop.hbase類的類。此類就像一個表名和列族的容器。

//creating table descriptor
HTableDescriptor table = new HTableDescriptor(toBytes("Table name"));

//creating column family descriptor
HColumnDescriptor family = new HColumnDescriptor(toBytes("column family"));

//adding coloumn family to HTable
table.addFamily(family);

步驟3:透過Admin執行

使用HBaseAdmin類的createTable()方法,您可以在Admin模式下執行建立的表。

admin.createTable(table);

以下是透過admin建立表的完整程式。

import java.io.IOException;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.TableName;

import org.apache.hadoop.conf.Configuration;

public class CreateTable {
      
   public static void main(String[] args) throws IOException {

      // Instantiating configuration class
      Configuration con = HBaseConfiguration.create();

      // Instantiating HbaseAdmin class
      HBaseAdmin admin = new HBaseAdmin(con);

      // Instantiating table descriptor class
      HTableDescriptor tableDescriptor = new
      HTableDescriptor(TableName.valueOf("emp"));

      // Adding column families to table descriptor
      tableDescriptor.addFamily(new HColumnDescriptor("personal"));
      tableDescriptor.addFamily(new HColumnDescriptor("professional"));

      // Execute the table through admin
      admin.createTable(tableDescriptor);
      System.out.println(" Table created ");
   }
}

編譯並執行上述程式,如下所示。

$javac CreateTable.java
$java CreateTable

輸出應如下所示:

Table created

HBase - 列出表

使用HBase Shell列出表

list是用於列出HBase中所有表的命令。以下是list命令的語法:

hbase(main):001:0 > list

當您在HBase提示符中鍵入並執行此命令時,它將顯示HBase中所有表的列表,如下所示。

hbase(main):001:0> list
TABLE
emp

在這裡您可以看到一個名為emp的表。

使用Java API列出表

請按照以下步驟使用Java API從HBase獲取表的列表。

步驟 1

您在HBaseAdmin類中有一個名為listTables()的方法,用於獲取HBase中所有表的列表。此方法返回一個HTableDescriptor物件陣列。

//creating a configuration object
Configuration conf = HBaseConfiguration.create();

//Creating HBaseAdmin object
HBaseAdmin admin = new HBaseAdmin(conf);

//Getting all the list of tables using HBaseAdmin object
HTableDescriptor[] tableDescriptor = admin.listTables();

步驟 2

您可以使用HTableDescriptor類的length變數獲取HTableDescriptor[]陣列的長度。使用getNameAsString()方法從該物件獲取表的名稱。使用這些執行“for”迴圈並獲取HBase中表的列表。

以下是使用Java API列出HBase中所有表的程式。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.client.HBaseAdmin;

public class ListTables {

   public static void main(String args[])throws MasterNotRunningException, IOException{

      // Instantiating a configuration class
      Configuration conf = HBaseConfiguration.create();

      // Instantiating HBaseAdmin class
      HBaseAdmin admin = new HBaseAdmin(conf);

      // Getting all the list of tables using HBaseAdmin object
      HTableDescriptor[] tableDescriptor = admin.listTables();

      // printing all the table names.
      for (int i=0; i<tableDescriptor.length;i++ ){
         System.out.println(tableDescriptor[i].getNameAsString());
      }
   
   }
}

編譯並執行上述程式,如下所示。

$javac ListTables.java
$java ListTables

輸出應如下所示:

User
emp

HBase - 停用表

使用HBase Shell停用表

要刪除表或更改其設定,您需要首先使用disable命令停用該表。您可以使用enable命令重新啟用它。

以下是停用表的語法:

disable ‘emp’

示例

以下是一個示例,顯示如何停用表。

hbase(main):025:0> disable 'emp'
0 row(s) in 1.2760 seconds

驗證

停用表後,您仍然可以透過listexists命令感知它的存在。您無法掃描它。它將為您提供以下錯誤。

hbase(main):028:0> scan 'emp'
ROW         COLUMN + CELL
ERROR: emp is disabled.

is_disabled

此命令用於查詢表是否已停用。其語法如下:

hbase> is_disabled 'table name'

以下示例驗證名為emp的表是否已停用。如果已停用,則返回true;否則返回false。

hbase(main):031:0> is_disabled 'emp'
true
0 row(s) in 0.0440 seconds

disable_all

此命令用於停用與給定正則表示式匹配的所有表。disable_all命令的語法如下:

hbase> disable_all 'r.*'

假設HBase中有5個表,分別為raja、rajani、rajendra、rajesh和raju。以下程式碼將停用所有以raj開頭的表。

hbase(main):002:07> disable_all 'raj.*'
raja
rajani
rajendra
rajesh
raju
Disable the above 5 tables (y/n)?
y
5 tables successfully disabled

使用Java API停用表

要驗證表是否已停用,請使用isTableDisabled()方法;要停用表,請使用disableTable()方法。這些方法屬於HBaseAdmin類。請按照以下步驟停用表。

步驟 1

例項化HBaseAdmin類,如下所示。

// Creating configuration object
Configuration conf = HBaseConfiguration.create();

// Creating HBaseAdmin object
HBaseAdmin admin = new HBaseAdmin(conf);

步驟 2

使用isTableDisabled()方法驗證表是否已停用,如下所示。

Boolean b = admin.isTableDisabled("emp");

步驟 3

如果表未停用,請將其停用,如下所示。

if(!b){
   admin.disableTable("emp");
   System.out.println("Table disabled");
}

以下是驗證表是否已停用;如果未停用,如何停用的完整程式。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.client.HBaseAdmin;

public class DisableTable{

   public static void main(String args[]) throws MasterNotRunningException, IOException{

      // Instantiating configuration class
      Configuration conf = HBaseConfiguration.create();
 
      // Instantiating HBaseAdmin class
      HBaseAdmin admin = new HBaseAdmin(conf);

      // Verifying weather the table is disabled
      Boolean bool = admin.isTableDisabled("emp");
      System.out.println(bool);

      // Disabling the table using HBaseAdmin object
      if(!bool){
         admin.disableTable("emp");
         System.out.println("Table disabled");
      }
   }
}

編譯並執行上述程式,如下所示。

$javac DisableTable.java
$java DsiableTable

輸出應如下所示:

false
Table disabled

HBase - 啟用表

使用HBase Shell啟用表

啟用表的語法:

enable ‘emp’

示例

以下是一個啟用表的示例。

hbase(main):005:0> enable 'emp'
0 row(s) in 0.4580 seconds

驗證

啟用表後,掃描它。如果您可以看到模式,則您的表已成功啟用。

hbase(main):006:0> scan 'emp'

   ROW                        COLUMN + CELL

1 column = personal data:city, timestamp = 1417516501, value = hyderabad

1 column = personal data:name, timestamp = 1417525058, value = ramu

1 column = professional data:designation, timestamp = 1417532601, value = manager

1 column = professional data:salary, timestamp = 1417524244109, value = 50000

2 column = personal data:city, timestamp = 1417524574905, value = chennai

2 column = personal data:name, timestamp = 1417524556125, value = ravi

2 column = professional data:designation, timestamp = 14175292204, value = sr:engg

2 column = professional data:salary, timestamp = 1417524604221, value = 30000 

3 column = personal data:city, timestamp = 1417524681780, value = delhi

3 column = personal data:name, timestamp = 1417524672067, value = rajesh

3 column = professional data:designation, timestamp = 14175246987, value = jr:engg

3 column = professional data:salary, timestamp = 1417524702514, value = 25000

3 row(s) in 0.0400 seconds

is_enabled

此命令用於查詢表是否已啟用。其語法如下:

hbase> is_enabled 'table name'

以下程式碼驗證名為emp的表是否已啟用。如果已啟用,則返回true;否則返回false。

hbase(main):031:0> is_enabled 'emp'
true
0 row(s) in 0.0440 seconds

使用Java API啟用表

要驗證表是否已啟用,請使用isTableEnabled()方法;要啟用表,請使用enableTable()方法。這些方法屬於HBaseAdmin類。請按照以下步驟啟用表。

步驟1

例項化HBaseAdmin類,如下所示。

// Creating configuration object
Configuration conf = HBaseConfiguration.create();

// Creating HBaseAdmin object
HBaseAdmin admin = new HBaseAdmin(conf);

步驟 2

使用isTableEnabled()方法驗證表是否已啟用,如下所示。

Boolean bool = admin.isTableEnabled("emp");

步驟 3

如果表未停用,請將其停用,如下所示。

if(!bool){
   admin.enableTable("emp");
   System.out.println("Table enabled");
}

以下是驗證表是否已啟用;如果未啟用,如何啟用的完整程式。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.client.HBaseAdmin;

public class EnableTable{

   public static void main(String args[]) throws MasterNotRunningException, IOException{

      // Instantiating configuration class
      Configuration conf = HBaseConfiguration.create();

      // Instantiating HBaseAdmin class
      HBaseAdmin admin = new HBaseAdmin(conf);

      // Verifying whether the table is disabled
      Boolean bool = admin.isTableEnabled("emp");
      System.out.println(bool);

      // Enabling the table using HBaseAdmin object
      if(!bool){
         admin.enableTable("emp");
         System.out.println("Table Enabled");
      }
   }
}

編譯並執行上述程式,如下所示。

$javac EnableTable.java
$java EnableTable

輸出應如下所示:

false
Table Enabled

HBase - 描述和修改

describe

此命令返回表的描述。其語法如下:

hbase> describe 'table name'

以下是emp表上describe命令的輸出。

hbase(main):006:0> describe 'emp'
   DESCRIPTION
      ENABLED
      
'emp', {NAME ⇒ 'READONLY', DATA_BLOCK_ENCODING ⇒ 'NONE', BLOOMFILTER
⇒ 'ROW', REPLICATION_SCOPE ⇒ '0', COMPRESSION ⇒ 'NONE', VERSIONS ⇒
'1', TTL true

⇒ 'FOREVER', MIN_VERSIONS ⇒ '0', KEEP_DELETED_CELLS ⇒ 'false',
BLOCKSIZE ⇒ '65536', IN_MEMORY ⇒ 'false', BLOCKCACHE ⇒ 'true'}, {NAME
⇒ 'personal

data', DATA_BLOCK_ENCODING ⇒ 'NONE', BLOOMFILTER ⇒ 'ROW',
REPLICATION_SCOPE ⇒ '0', VERSIONS ⇒ '5', COMPRESSION ⇒ 'NONE',
MIN_VERSIONS ⇒ '0', TTL

⇒ 'FOREVER', KEEP_DELETED_CELLS ⇒ 'false', BLOCKSIZE ⇒ '65536',
IN_MEMORY ⇒ 'false', BLOCKCACHE ⇒ 'true'}, {NAME ⇒ 'professional
data', DATA_BLO

CK_ENCODING ⇒ 'NONE', BLOOMFILTER ⇒ 'ROW', REPLICATION_SCOPE ⇒ '0',
VERSIONS ⇒ '1', COMPRESSION ⇒ 'NONE', MIN_VERSIONS ⇒ '0', TTL ⇒
'FOREVER', K

EEP_DELETED_CELLS ⇒ 'false', BLOCKSIZE ⇒ '65536', IN_MEMORY ⇒
'false', BLOCKCACHE ⇒ 'true'}, {NAME ⇒ 'table_att_unset',
DATA_BLOCK_ENCODING ⇒ 'NO 

NE', BLOOMFILTER ⇒ 'ROW', REPLICATION_SCOPE ⇒ '0', COMPRESSION ⇒
'NONE', VERSIONS ⇒ '1', TTL ⇒ 'FOREVER', MIN_VERSIONS ⇒ '0',
KEEP_DELETED_CELLS

⇒ 'false', BLOCKSIZE ⇒ '6

alter

Alter是用於對現有表進行更改的命令。使用此命令,您可以更改列族的最大單元格數、設定和刪除表範圍運算子以及從表中刪除列族。

更改列族的最大單元格數

以下是更改列族最大單元格數的語法:

hbase> alter 't1', NAME ⇒ 'f1', VERSIONS ⇒ 5

在以下示例中,最大單元格數設定為5。

hbase(main):003:0> alter 'emp', NAME ⇒ 'personal data', VERSIONS ⇒ 5
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 2.3050 seconds

表範圍運算子

使用alter,您可以設定和刪除表範圍運算子,例如MAX_FILESIZE、READONLY、MEMSTORE_FLUSHSIZE、DEFERRED_LOG_FLUSH等。

設定只讀

以下是將表設為只讀的語法:

hbase>alter 't1', READONLY(option)

在以下示例中,我們已將emp表設為只讀。

hbase(main):006:0> alter 'emp', READONLY
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 2.2140 seconds

刪除表範圍運算子

我們還可以刪除表範圍運算子。以下是從emp表中刪除“MAX_FILESIZE”的語法:

hbase> alter 't1', METHOD ⇒ 'table_att_unset', NAME ⇒ 'MAX_FILESIZE'

刪除列族

使用alter,您還可以刪除列族。以下是使用alter刪除列族的語法:

hbase> alter ‘ table name ’, ‘delete’ ⇒ ‘ column family ’ 

以下是從“emp”表中刪除列族的示例。

假設HBase中有一個名為employee的表。它包含以下資料:

hbase(main):006:0> scan 'employee'

   ROW                   COLUMN+CELL

row1 column = personal:city, timestamp = 1418193767, value = hyderabad

row1 column = personal:name, timestamp = 1418193806767, value = raju

row1 column = professional:designation, timestamp = 1418193767, value = manager

row1 column = professional:salary, timestamp = 1418193806767, value = 50000

1 row(s) in 0.0160 seconds 

現在讓我們使用alter命令刪除名為professional的列族。

hbase(main):007:0> alter 'employee','delete'⇒'professional'
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 2.2380 seconds 

現在驗證更改後表中的資料。觀察列族“professional”不再存在,因為我們已將其刪除。

hbase(main):003:0> scan 'employee'
   ROW             COLUMN + CELL
row1 column = personal:city, timestamp = 14181936767, value = hyderabad

row1 column = personal:name, timestamp = 1418193806767, value = raju

1 row(s) in 0.0830 seconds

使用Java API新增列族

您可以使用HBAseAdmin類的addColumn()方法向表中新增列族。請按照以下步驟向表中新增列族。

步驟 1

例項化HBaseAdmin類。

// Instantiating configuration object
Configuration conf = HBaseConfiguration.create();

// Instantiating HBaseAdmin class
HBaseAdmin admin = new HBaseAdmin(conf); 

步驟 2

addColumn()方法需要表名和HColumnDescriptor類的一個物件。因此,例項化HColumnDescriptor類。HColumnDescriptor的建構函式反過來需要要新增的列族名。這裡我們將名為“contactDetails”的列族新增到現有的“employee”表中。

// Instantiating columnDescriptor object

HColumnDescriptor columnDescriptor = new
HColumnDescriptor("contactDetails");

步驟 3

使用addColumn方法新增列族。將表名和HColumnDescriptor類物件作為引數傳遞給此方法。

// Adding column family
admin.addColumn("employee", new HColumnDescriptor("columnDescriptor"));

以下是向現有表新增列族的完整程式。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.client.HBaseAdmin;

public class AddColoumn{

   public static void main(String args[]) throws MasterNotRunningException, IOException{

      // Instantiating configuration class.
      Configuration conf = HBaseConfiguration.create();

      // Instantiating HBaseAdmin class.
      HBaseAdmin admin = new HBaseAdmin(conf);

      // Instantiating columnDescriptor class
      HColumnDescriptor columnDescriptor = new HColumnDescriptor("contactDetails");
      
      // Adding column family
      admin.addColumn("employee", columnDescriptor);
      System.out.println("coloumn added");
   }
}

編譯並執行上述程式,如下所示。

$javac AddColumn.java
$java AddColumn

只有在您已在“.bashrc”中設定類路徑的情況下,上述編譯才有效。如果您沒有設定,請按照以下步驟編譯您的.java檔案。

//if "/home/home/hadoop/hbase " is your Hbase home folder then.

$javac -cp /home/hadoop/hbase/lib/*: Demo.java

如果一切順利,它將產生以下輸出:

column added

使用Java API刪除列族

可以使用HBaseAdmin類的deleteColumn()方法從表中刪除列族。請按照以下步驟將列族新增到表中。

步驟1

例項化HBaseAdmin類。

// Instantiating configuration object
Configuration conf = HBaseConfiguration.create();

// Instantiating HBaseAdmin class
HBaseAdmin admin = new HBaseAdmin(conf); 

步驟2

使用deleteColumn()方法新增列族。將表名和列族名作為引數傳遞給此方法。

// Deleting column family
admin.deleteColumn("employee", "contactDetails"); 

下面是完整的程式,用於從現有表中刪除列族。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.client.HBaseAdmin;

public class DeleteColoumn{

   public static void main(String args[]) throws MasterNotRunningException, IOException{

      // Instantiating configuration class.
      Configuration conf = HBaseConfiguration.create();

      // Instantiating HBaseAdmin class.
      HBaseAdmin admin = new HBaseAdmin(conf);

      // Deleting a column family
      admin.deleteColumn("employee","contactDetails");
      System.out.println("coloumn deleted"); 
   }
}

編譯並執行上述程式,如下所示。

$javac DeleteColumn.java
$java DeleteColumn

輸出應如下所示:

column deleted

HBase - 判斷表是否存在

使用HBase Shell驗證表的存在

可以使用exists命令驗證表的存在。以下示例演示如何使用此命令。

hbase(main):024:0> exists 'emp'
Table emp does exist

0 row(s) in 0.0750 seconds

==================================================================

hbase(main):015:0> exists 'student'
Table student does not exist

0 row(s) in 0.0480 seconds

使用Java API驗證表的存在

可以使用HBaseAdmin類的tableExists()方法驗證HBase中表的存在。請按照以下步驟驗證HBase中表的存在。

步驟 1

Instantiate the HBaseAdimn class

// Instantiating configuration object
Configuration conf = HBaseConfiguration.create();

// Instantiating HBaseAdmin class
HBaseAdmin admin = new HBaseAdmin(conf); 

步驟 2

使用tableExists()方法驗證表的存在。

以下是使用Java API測試HBase中表存在的Java程式。

import java.io.IOException;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.HBaseAdmin;

public class TableExists{

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

      // Instantiating configuration class
      Configuration conf = HBaseConfiguration.create();

      // Instantiating HBaseAdmin class
      HBaseAdmin admin = new HBaseAdmin(conf);

      // Verifying the existance of the table
      boolean bool = admin.tableExists("emp");
      System.out.println( bool);
   }
} 

編譯並執行上述程式,如下所示。

$javac TableExists.java
$java TableExists 

輸出應如下所示:

true

HBase - 刪除表

使用HBase Shell刪除表

使用drop命令,可以刪除表。在刪除表之前,必須先停用它。

hbase(main):018:0> disable 'emp'
0 row(s) in 1.4580 seconds

hbase(main):019:0> drop 'emp'
0 row(s) in 0.3060 seconds

使用exists命令驗證表是否已刪除。

hbase(main):020:07gt; exists 'emp'
Table emp does not exist
0 row(s) in 0.0730 seconds

drop_all

此命令用於刪除與命令中給定的“regex”匹配的表。其語法如下:

hbase> drop_all ‘t.*’ 

注意:刪除表之前,必須先停用它。

示例

假設有名為raja、rajani、rajendra、rajesh和raju的表。

hbase(main):017:0> list
TABLE
raja
rajani
rajendra 
rajesh
raju
9 row(s) in 0.0270 seconds

所有這些表都以字母raj開頭。首先,讓我們使用如下所示的disable_all命令停用所有這些表。

hbase(main):002:0> disable_all 'raj.*'
raja
rajani
rajendra
rajesh
raju
Disable the above 5 tables (y/n)?
y
5 tables successfully disabled

現在可以使用如下所示的drop_all命令刪除所有這些表。

hbase(main):018:0> drop_all 'raj.*'
raja
rajani
rajendra
rajesh
raju
Drop the above 5 tables (y/n)?
y
5 tables successfully dropped

使用Java API刪除表

可以使用HBaseAdmin類的deleteTable()方法刪除表。請按照以下步驟使用Java API刪除表。

步驟 1

例項化HBaseAdmin類。

// creating a configuration object
Configuration conf = HBaseConfiguration.create();

// Creating HBaseAdmin object
HBaseAdmin admin = new HBaseAdmin(conf); 

步驟 2

使用HBaseAdmin類的disableTable()方法停用表。

admin.disableTable("emp1");

步驟 3

現在使用HBaseAdmin類的deleteTable()方法刪除表。

admin.deleteTable("emp12");

下面是完整的Java程式,用於刪除HBase中的表。

import java.io.IOException;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.HBaseAdmin;

public class DeleteTable {

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

      // Instantiating configuration class
      Configuration conf = HBaseConfiguration.create();

      // Instantiating HBaseAdmin class
      HBaseAdmin admin = new HBaseAdmin(conf);

      // disabling table named emp
      admin.disableTable("emp12");

      // Deleting emp
      admin.deleteTable("emp12");
      System.out.println("Table deleted");
   }
}

編譯並執行上述程式,如下所示。

$javac DeleteTable.java
$java DeleteTable

輸出應如下所示:

Table deleted

HBase - 關閉

exit

透過鍵入exit命令退出shell。

hbase(main):021:0> exit

停止HBase

要停止HBase,請瀏覽到HBase主資料夾並鍵入以下命令。

./bin/stop-hbase.sh

使用Java API停止HBase

可以使用HBaseAdmin類的shutdown()方法關閉HBase。請按照以下步驟關閉HBase。

步驟 1

例項化HbaseAdmin類。

// Instantiating configuration object
Configuration conf = HBaseConfiguration.create();

// Instantiating HBaseAdmin object
HBaseAdmin admin = new HBaseAdmin(conf);

步驟 2

使用HBaseAdmin類的shutdown()方法關閉HBase。

admin.shutdown();

以下是停止HBase的程式。

import java.io.IOException;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.HBaseAdmin;

public class ShutDownHbase{

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

      // Instantiating configuration class
      Configuration conf = HBaseConfiguration.create();

      // Instantiating HBaseAdmin class
      HBaseAdmin admin = new HBaseAdmin(conf);

      // Shutting down HBase
      System.out.println("Shutting down hbase");
      admin.shutdown();
   }
}

編譯並執行上述程式,如下所示。

$javac ShutDownHbase.java
$java ShutDownHbase

輸出應如下所示:

Shutting down hbase

HBase - 客戶端API

本章介紹用於對HBase表執行CRUD操作的HBase Java客戶端API。HBase是用Java編寫的,並且具有Java原生API。因此,它提供了對資料操作語言(DML)的程式設計訪問。

HBase Configuration類

將HBase配置檔案新增到Configuration。此類屬於org.apache.hadoop.hbase包。

方法和描述

序號 方法和描述
1

static org.apache.hadoop.conf.Configuration create()

此方法使用HBase資源建立Configuration。

HTable類

HTable是HBase內部類,表示HBase表。它是表的實現,用於與單個HBase表進行通訊。此類屬於org.apache.hadoop.hbase.client類。

建構函式

序號 建構函式和描述
1

HTable()

2

HTable(TableName tableName, ClusterConnection connection, ExecutorService pool)

使用此建構函式,可以建立一個物件來訪問HBase表。

方法和描述

序號 方法和描述
1

void close()

釋放HTable的所有資源。

2

void delete(Delete delete)

刪除指定的單元格/行。

3

boolean exists(Get get)

使用此方法,可以測試表中列的存在性,如Get指定的那樣。

4

Result get(Get get)

從給定行檢索某些單元格。

5

org.apache.hadoop.conf.Configuration getConfiguration()

返回此例項使用的Configuration物件。

6

TableName getName()

返回此表的表名例項。

7

HTableDescriptor getTableDescriptor()

返回此表的表描述符。

8

byte[] getTableName()

返回此表的名稱。

9

void put(Put put)

使用此方法,可以將資料插入表中。

Put類

此類用於對單個行執行Put操作。它屬於org.apache.hadoop.hbase.client包。

建構函式

序號 建構函式和描述
1

Put(byte[] row)

使用此建構函式,可以為指定的行建立Put操作。

2

Put(byte[] rowArray, int rowOffset, int rowLength)

使用此建構函式,可以複製傳入的行鍵以保留本地副本。

3

Put(byte[] rowArray, int rowOffset, int rowLength, long ts)

使用此建構函式,可以複製傳入的行鍵以保留本地副本。

4

Put(byte[] row, long ts)

使用此建構函式,我們可以使用給定的時間戳為指定的行建立一個Put操作。

方法

序號 方法和描述
1

Put add(byte[] family, byte[] qualifier, byte[] value)

將指定的列和值新增到此Put操作。

2

Put add(byte[] family, byte[] qualifier, long ts, byte[] value)

將指定的列和值(以及指定的時間戳作為其版本)新增到此Put操作。

3

Put add(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value)

將指定的列和值(以及指定的時間戳作為其版本)新增到此Put操作。

4

Put add(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value)

將指定的列和值(以及指定的時間戳作為其版本)新增到此Put操作。

Get類

此類用於對單個行執行Get操作。此類屬於org.apache.hadoop.hbase.client包。

建構函式

序號 建構函式和描述
1

Get(byte[] row)

使用此建構函式,可以為指定的行建立Get操作。

2 Get(Get get)

方法

序號 方法和描述
1

Get addColumn(byte[] family, byte[] qualifier)

從具有指定限定符的特定族中檢索列。

2

Get addFamily(byte[] family)

從指定的族中檢索所有列。

Delete類

此類用於對單個行執行Delete操作。要刪除整行,請使用要刪除的行例項化Delete物件。此類屬於org.apache.hadoop.hbase.client包。

建構函式

序號 建構函式和描述
1

Delete(byte[] row)

為指定的行建立Delete操作。

2

Delete(byte[] rowArray, int rowOffset, int rowLength)

為指定的行和時間戳建立Delete操作。

3

Delete(byte[] rowArray, int rowOffset, int rowLength, long ts)

為指定的行和時間戳建立Delete操作。

4

Delete(byte[] row, long timestamp)

為指定的行和時間戳建立Delete操作。

方法

序號 方法和描述
1

Delete addColumn(byte[] family, byte[] qualifier)

刪除指定列的最新版本。

2

Delete addColumns(byte[] family, byte[] qualifier, long timestamp)

刪除時間戳小於或等於指定時間戳的指定列的所有版本。

3

Delete addFamily(byte[] family)

刪除指定族的所有列的所有版本。

4

Delete addFamily(byte[] family, long timestamp)

刪除時間戳小於或等於指定時間戳的指定族的所有列。

Result類

此類用於獲取Get或Scan查詢的單個行結果。

建構函式

序號 建構函式
1

Result()

使用此建構函式,可以建立一個沒有KeyValue有效負載的空Result;如果呼叫raw Cells(),則返回null。

方法

序號 方法和描述
1

byte[] getValue(byte[] family, byte[] qualifier)

此方法用於獲取指定列的最新版本。

2

byte[] getRow()

此方法用於檢索與建立此Result的行對應的行鍵。

HBase - 建立資料

使用HBase Shell插入資料

本章演示如何在HBase表中建立資料。要在HBase表中建立資料,可以使用以下命令和方法:

  • put命令,

  • Put類的add()方法,以及

  • HTable類的put()方法。

例如,我們將要在HBase中建立以下表。

HBase Table

使用put命令,可以將行插入表中。其語法如下:

put ’<table name>’,’row1’,’<colfamily:colname>’,’<value>’

插入第一行

讓我們將第一行值插入到emp表中,如下所示。

hbase(main):005:0> put 'emp','1','personal data:name','raju'
0 row(s) in 0.6600 seconds
hbase(main):006:0> put 'emp','1','personal data:city','hyderabad'
0 row(s) in 0.0410 seconds
hbase(main):007:0> put 'emp','1','professional
data:designation','manager'
0 row(s) in 0.0240 seconds
hbase(main):007:0> put 'emp','1','professional data:salary','50000'
0 row(s) in 0.0240 seconds

以相同的方式使用put命令插入其餘行。如果插入整個表,您將獲得以下輸出。

hbase(main):022:0> scan 'emp'

   ROW                        COLUMN+CELL
1 column=personal data:city, timestamp=1417524216501, value=hyderabad

1 column=personal data:name, timestamp=1417524185058, value=ramu

1 column=professional data:designation, timestamp=1417524232601,

 value=manager
 
1 column=professional data:salary, timestamp=1417524244109, value=50000

2 column=personal data:city, timestamp=1417524574905, value=chennai

2 column=personal data:name, timestamp=1417524556125, value=ravi

2 column=professional data:designation, timestamp=1417524592204,

 value=sr:engg
 
2 column=professional data:salary, timestamp=1417524604221, value=30000

3 column=personal data:city, timestamp=1417524681780, value=delhi

3 column=personal data:name, timestamp=1417524672067, value=rajesh

3 column=professional data:designation, timestamp=1417524693187,

value=jr:engg
3 column=professional data:salary, timestamp=1417524702514,

value=25000 

使用Java API插入資料

可以使用Put類的add()方法將資料插入Hbase。可以使用HTable類的put()方法儲存它。這些類屬於org.apache.hadoop.hbase.client包。以下是建立HBase表中的資料的步驟。

步驟1:例項化Configuration類

Configuration類將HBase配置檔案新增到其物件中。可以使用HbaseConfiguration類的create()方法建立配置物件,如下所示。

Configuration conf = HbaseConfiguration.create();

步驟2:例項化HTable類

您有一個名為HTable的類,它是HBase中Table的實現。此類用於與單個HBase表進行通訊。在例項化此類時,它接受配置物件和表名作為引數。可以如下所示例項化HTable類。

HTable hTable = new HTable(conf, tableName);

步驟3:例項化Put類

要將資料插入HBase表,可以使用add()方法及其變體。此方法屬於Put,因此請例項化put類。此類需要您要將資料插入其中的行名(字串格式)。可以如下所示例項化Put類。

Put p = new Put(Bytes.toBytes("row1"));

步驟4:插入資料

Put類的add()方法用於插入資料。它需要3個位元組陣列分別表示列族、列限定符(列名)和要插入的值。使用add()方法將資料插入HBase表,如下所示。

p.add(Bytes.toBytes("coloumn family "), Bytes.toBytes("column
name"),Bytes.toBytes("value"));

步驟5:儲存表中的資料

插入所需行後,透過將put例項新增到HTable類的put()方法來儲存更改,如下所示。

hTable.put(p); 

步驟6:關閉HTable例項

在HBase表中建立資料後,使用close()方法關閉HTable例項,如下所示。

hTable.close(); 

以下是完整的程式,用於在HBase表中建立資料。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;

public class InsertData{

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

      // Instantiating Configuration class
      Configuration config = HBaseConfiguration.create();

      // Instantiating HTable class
      HTable hTable = new HTable(config, "emp");

      // Instantiating Put class
      // accepts a row name.
      Put p = new Put(Bytes.toBytes("row1")); 

      // adding values using add() method
      // accepts column family name, qualifier/row name ,value
      p.add(Bytes.toBytes("personal"),
      Bytes.toBytes("name"),Bytes.toBytes("raju"));

      p.add(Bytes.toBytes("personal"),
      Bytes.toBytes("city"),Bytes.toBytes("hyderabad"));

      p.add(Bytes.toBytes("professional"),Bytes.toBytes("designation"),
      Bytes.toBytes("manager"));

      p.add(Bytes.toBytes("professional"),Bytes.toBytes("salary"),
      Bytes.toBytes("50000"));
      
      // Saving the put Instance to the HTable.
      hTable.put(p);
      System.out.println("data inserted");
      
      // closing HTable
      hTable.close();
   }
}

編譯並執行上述程式,如下所示。

$javac InsertData.java
$java InsertData

輸出應如下所示:

data inserted

HBase - 更新資料

使用HBase Shell更新資料

可以使用put命令更新現有單元格的值。為此,只需遵循相同的語法,並像下面所示那樣提及您的新值。

put ‘table name’,’row ’,'Column family:column name',’new value’

新給定的值將替換現有值,從而更新行。

示例

假設HBase中有一個名為emp的表,其中包含以下資料。

hbase(main):003:0> scan 'emp'
 ROW              COLUMN + CELL
row1 column = personal:name, timestamp = 1418051555, value = raju
row1 column = personal:city, timestamp = 1418275907, value = Hyderabad
row1 column = professional:designation, timestamp = 14180555,value = manager
row1 column = professional:salary, timestamp = 1418035791555,value = 50000
1 row(s) in 0.0100 seconds

以下命令會將名為“Raju”的員工的城市值更新為“Delhi”。

hbase(main):002:0> put 'emp','row1','personal:city','Delhi'
0 row(s) in 0.0400 seconds

更新後的表如下所示,您可以看到Raju的城市已更改為“Delhi”。

hbase(main):003:0> scan 'emp'
  ROW          COLUMN + CELL
row1 column = personal:name, timestamp = 1418035791555, value = raju
row1 column = personal:city, timestamp = 1418274645907, value = Delhi
row1 column = professional:designation, timestamp = 141857555,value = manager
row1 column = professional:salary, timestamp = 1418039555, value = 50000
1 row(s) in 0.0100 seconds

使用Java API更新資料

您可以使用put()方法更新特定單元格中的資料。請按照以下步驟更新表的現有單元格值。

步驟1:例項化Configuration類

Configuration類將其物件新增到HBase配置檔案。您可以使用HbaseConfiguration類的create()方法建立配置物件,如下所示。

Configuration conf = HbaseConfiguration.create();

步驟2:例項化HTable類

您有一個名為HTable的類,它是HBase中Table的實現。此類用於與單個HBase表進行通訊。例項化此類時,它接受配置物件和表名稱作為引數。您可以如下所示例項化HTable類。

HTable hTable = new HTable(conf, tableName);

步驟3:例項化Put類

要將資料插入HBase表,可以使用add()方法及其變體。此方法屬於Put,因此請例項化put類。此類需要您要向其中插入資料的行名(字串格式)。您可以如下所示例項化Put類。

Put p = new Put(Bytes.toBytes("row1"));

步驟4:更新現有單元格

Put類的add()方法用於插入資料。它需要3個位元組陣列,分別表示列族、列限定符(列名)和要插入的值。使用add()方法將資料插入HBase表,如下所示。

p.add(Bytes.toBytes("coloumn family "), Bytes.toBytes("column
name"),Bytes.toBytes("value"));
p.add(Bytes.toBytes("personal"),
Bytes.toBytes("city"),Bytes.toBytes("Delih"));

步驟5:儲存表中的資料

插入所需行後,透過將put例項新增到HTable類的put()方法來儲存更改,如下所示。

hTable.put(p); 

步驟6:關閉HTable例項

在HBase表中建立資料後,使用close()方法關閉HTable例項,如下所示。

hTable.close();

以下是更新特定表中資料的完整程式。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;

public class UpdateData{

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

      // Instantiating Configuration class
      Configuration config = HBaseConfiguration.create();

      // Instantiating HTable class
      HTable hTable = new HTable(config, "emp");

      // Instantiating Put class
      //accepts a row name
      Put p = new Put(Bytes.toBytes("row1"));

      // Updating a cell value
      p.add(Bytes.toBytes("personal"),
      Bytes.toBytes("city"),Bytes.toBytes("Delih"));

      // Saving the put Instance to the HTable.
      hTable.put(p);
      System.out.println("data Updated");

      // closing HTable
      hTable.close();
   }
}

編譯並執行上述程式,如下所示。

$javac UpdateData.java
$java UpdateData

輸出應如下所示:

data Updated

HBase - 讀取資料

使用HBase Shell讀取資料

get命令和HTable類的get()方法用於從HBase中的表讀取資料。使用get命令,您可以一次獲取一行資料。其語法如下:

get ’<table name>’,’row1’

示例

以下示例演示如何使用get命令。讓我們掃描emp表的第一行。

hbase(main):012:0> get 'emp', '1'

   COLUMN                     CELL
   
personal : city timestamp = 1417521848375, value = hyderabad

personal : name timestamp = 1417521785385, value = ramu

professional: designation timestamp = 1417521885277, value = manager

professional: salary timestamp = 1417521903862, value = 50000

4 row(s) in 0.0270 seconds

讀取特定列

以下是使用get方法讀取特定列的語法。

hbase> get 'table name', ‘rowid’, {COLUMN ⇒ ‘column family:column name ’}

示例

以下是讀取HBase表中特定列的示例。

hbase(main):015:0> get 'emp', 'row1', {COLUMN ⇒ 'personal:name'}
  COLUMN                CELL  
personal:name timestamp = 1418035791555, value = raju
1 row(s) in 0.0080 seconds

使用Java API讀取資料

要從HBase表讀取資料,請使用HTable類的get()方法。此方法需要一個Get類的例項。請按照以下步驟從HBase表檢索資料。

步驟1:例項化Configuration類

Configuration類將其物件新增到HBase配置檔案。您可以使用HbaseConfiguration類的create()方法建立配置物件,如下所示。

Configuration conf = HbaseConfiguration.create();

步驟2:例項化HTable類

您有一個名為HTable的類,它是HBase中Table的實現。此類用於與單個HBase表進行通訊。例項化此類時,它接受配置物件和表名稱作為引數。您可以如下所示例項化HTable類。

HTable hTable = new HTable(conf, tableName);

步驟3:例項化Get類

您可以使用HTable類的get()方法從HBase表檢索資料。此方法從給定的行中提取一個單元格。它需要一個Get類物件作為引數。建立它,如下所示。

Get get = new Get(toBytes("row1"));

步驟4:讀取資料

在檢索資料時,您可以按ID獲取單行,或按一組行ID獲取一組行,或掃描整個表或部分行。

您可以使用Get類中的add方法變體檢索HBase表資料。

要從特定列族中獲取特定列,請使用以下方法。

get.addFamily(personal) 

要從特定列族中獲取所有列,請使用以下方法。

get.addColumn(personal, name) 

步驟5:獲取結果

透過將您的Get類例項傳遞到HTable類的get方法來獲取結果。此方法返回Result類物件,其中包含請求的結果。以下是get()方法的使用方法。

Result result = table.get(g);  

步驟6:從Result例項讀取值

Result類提供getValue()方法來讀取其例項中的值。使用它,如下所示,從Result例項讀取值。

byte [] value = result.getValue(Bytes.toBytes("personal"),Bytes.toBytes("name"));
byte [] value1 = result.getValue(Bytes.toBytes("personal"),Bytes.toBytes("city"));

以下是從HBase表讀取值的完整程式。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;

public class RetriveData{

   public static void main(String[] args) throws IOException, Exception{
   
      // Instantiating Configuration class
      Configuration config = HBaseConfiguration.create();

      // Instantiating HTable class
      HTable table = new HTable(config, "emp");

      // Instantiating Get class
      Get g = new Get(Bytes.toBytes("row1"));

      // Reading the data
      Result result = table.get(g);

      // Reading values from Result class object
      byte [] value = result.getValue(Bytes.toBytes("personal"),Bytes.toBytes("name"));

      byte [] value1 = result.getValue(Bytes.toBytes("personal"),Bytes.toBytes("city"));

      // Printing the values
      String name = Bytes.toString(value);
      String city = Bytes.toString(value1);
      
      System.out.println("name: " + name + " city: " + city);
   }
}

編譯並執行上述程式,如下所示。

$javac RetriveData.java
$java RetriveData

輸出應如下所示:

name: Raju city: Delhi

HBase - 刪除資料

刪除表中的特定單元格

使用delete命令,您可以刪除表中的特定單元格。delete命令的語法如下:

delete ‘<table name>’, ‘<row>’, ‘<column name >’, ‘<time stamp>’

示例

這是一個刪除特定單元格的示例。在這裡,我們正在刪除salary。

hbase(main):006:0> delete 'emp', '1', 'personal data:city',
1417521848375
0 row(s) in 0.0060 seconds

刪除表中的所有單元格

使用“deleteall”命令,您可以刪除一行中的所有單元格。“deleteall”命令的語法如下。

deleteall ‘<table name>’, ‘<row>’,

示例

這是一個“deleteall”命令的示例,我們在這裡刪除emp表中row1的所有單元格。

hbase(main):007:0> deleteall 'emp','1'
0 row(s) in 0.0240 seconds

使用scan命令驗證表。刪除表後,表的快照如下所示。

hbase(main):022:0> scan 'emp'

ROW                  COLUMN + CELL

2 column = personal data:city, timestamp = 1417524574905, value = chennai 

2 column = personal data:name, timestamp = 1417524556125, value = ravi

2 column = professional data:designation, timestamp = 1417524204, value = sr:engg

2 column = professional data:salary, timestamp = 1417524604221, value = 30000

3 column = personal data:city, timestamp = 1417524681780, value = delhi

3 column = personal data:name, timestamp = 1417524672067, value = rajesh
 
3 column = professional data:designation, timestamp = 1417523187, value = jr:engg

3 column = professional data:salary, timestamp = 1417524702514, value = 25000

使用Java API刪除資料

您可以使用HTable類的delete()方法從HBase表中刪除資料。請按照以下步驟從表中刪除資料。

步驟1:例項化Configuration類

Configuration類將其物件新增到HBase配置檔案。您可以使用HbaseConfiguration類的create()方法建立配置物件,如下所示。

Configuration conf = HbaseConfiguration.create();

步驟2:例項化HTable類

您有一個名為HTable的類,它是HBase中Table的實現。此類用於與單個HBase表進行通訊。例項化此類時,它接受配置物件和表名稱作為引數。您可以如下所示例項化HTable類。

HTable hTable = new HTable(conf, tableName); 

步驟3:例項化Delete類

透過傳遞要刪除行的rowid(位元組陣列格式)來例項化Delete類。您還可以將timestamp和Rowlock傳遞給此建構函式。

Delete delete = new Delete(toBytes("row1"));

步驟4:選擇要刪除的資料

您可以使用Delete類的delete方法刪除資料。此類具有各種delete方法。使用這些方法選擇要刪除的列或列族。請檢視以下顯示Delete類方法用法的示例。

delete.deleteColumn(Bytes.toBytes("personal"), Bytes.toBytes("name"));
delete.deleteFamily(Bytes.toBytes("professional"));

步驟5:刪除資料

透過將delete例項傳遞到HTable類的delete()方法來刪除所選資料,如下所示。

table.delete(delete); 

步驟6:關閉HTable例項

刪除資料後,關閉HTable例項。

table.close();

以下是從HBase表刪除資料的完整程式。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.util.Bytes;

public class DeleteData {

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

      // Instantiating Configuration class
      Configuration conf = HBaseConfiguration.create();

      // Instantiating HTable class
      HTable table = new HTable(conf, "employee");

      // Instantiating Delete class
      Delete delete = new Delete(Bytes.toBytes("row1"));
      delete.deleteColumn(Bytes.toBytes("personal"), Bytes.toBytes("name"));
      delete.deleteFamily(Bytes.toBytes("professional"));

      // deleting the data
      table.delete(delete);

      // closing the HTable object
      table.close();
      System.out.println("data deleted.....");
   }
}

編譯並執行上述程式,如下所示。

$javac Deletedata.java
$java DeleteData

輸出應如下所示:

data deleted

HBase - 掃描

使用HBase Shell掃描

scan命令用於檢視HTable中的資料。使用scan命令,您可以獲取表資料。其語法如下:

scan ‘<table name>’ 

示例

以下示例演示如何使用scan命令從表讀取資料。在這裡,我們正在讀取emp表。

hbase(main):010:0> scan 'emp'

ROW                           COLUMN + CELL

1 column = personal data:city, timestamp = 1417521848375, value = hyderabad
 
1 column = personal data:name, timestamp = 1417521785385, value = ramu

1 column = professional data:designation, timestamp = 1417585277,value = manager

1 column = professional data:salary, timestamp = 1417521903862, value = 50000

1 row(s) in 0.0370 seconds

使用Java API掃描

使用java API掃描整個表資料的完整程式如下所示。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.util.Bytes;

import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;


public class ScanTable{

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

      // Instantiating Configuration class
      Configuration config = HBaseConfiguration.create();

      // Instantiating HTable class
      HTable table = new HTable(config, "emp");

      // Instantiating the Scan class
      Scan scan = new Scan();

      // Scanning the required columns
      scan.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("name"));
      scan.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("city"));

      // Getting the scan result
      ResultScanner scanner = table.getScanner(scan);

      // Reading values from scan result
      for (Result result = scanner.next(); result != null; result = Scanner.next())

      System.out.println("Found row : " + result);
      //closing the scanner
      scanner.close();
   }
}

編譯並執行上述程式,如下所示。

$javac ScanTable.java
$java ScanTable 

輸出應如下所示:

Found row :
keyvalues={row1/personal:city/1418275612888/Put/vlen=5/mvcc=0,
row1/personal:name/1418035791555/Put/vlen=4/mvcc=0}

HBase - 計數和截斷

計數

您可以使用count命令計算表的行數。其語法如下:

count ‘<table name>’ 

刪除第一行後,emp表將有兩行。如下所示驗證它。

hbase(main):023:0> count 'emp'
2 row(s) in 0.090 seconds
⇒ 2 

截斷

此命令停用刪除並重新建立表。truncate的語法如下:

hbase> truncate 'table name'

示例

以下是truncate命令的示例。在這裡,我們截斷了emp表。

hbase(main):011:0> truncate 'emp'
Truncating 'one' table (it may take a while):
   - Disabling table...
   - Truncating table...
   0 row(s) in 1.5950 seconds

截斷表後,使用scan命令進行驗證。您將得到一個包含零行的表。

hbase(main):017:0> scan ‘emp’
ROW                  COLUMN + CELL
0 row(s) in 0.3110 seconds

HBase - 安全性

我們可以授予和撤銷HBase中使用者的許可權。出於安全目的,有三個命令:grant、revoke和user_permission。

grant

grant命令向特定使用者授予對錶的特定許可權,例如讀取、寫入、執行和管理。grant命令的語法如下:

hbase> grant <user> <permissions> [<table> [<column family> [<column; qualifier>]]

我們可以從RWXCA集中向用戶授予零個或多個許可權,其中:

  • R - 代表讀取許可權。
  • W - 代表寫入許可權。
  • X - 代表執行許可權。
  • C - 代表建立許可權。
  • A - 代表管理員許可權。

以下示例向名為“Tutorialspoint”的使用者授予所有許可權。

hbase(main):018:0> grant 'Tutorialspoint', 'RWXCA'

revoke

revoke命令用於撤銷使用者的表訪問許可權。其語法如下:

hbase> revoke <user>

以下程式碼撤銷名為“Tutorialspoint”的使用者的所有許可權。

hbase(main):006:0> revoke 'Tutorialspoint'

user_permission

此命令用於列出特定表的所有許可權。user_permission的語法如下:

hbase>user_permission ‘tablename’

以下程式碼列出“emp”表的所有使用者許可權。

hbase(main):013:0> user_permission 'emp'
廣告
© . All rights reserved.