HBase架構與基礎命令

bjynjj發表於2024-11-17

HBase架構與基礎命令

一、瞭解HBase

官方文件:https://hbase.apache.org/

image-20220608204643002

1.1 HBase概述

HBase 是一個高可靠性、高效能、面向列、可伸縮的分散式儲存系統,用於儲存海量的結構化或者半結構化,非結構化的資料(底層是位元組陣列做儲存的)

HBase是Hadoop的生態系統之一,是建立在Hadoop檔案系統(HDFS)之上的分散式、面向列的資料庫,透過利用Hadoop的檔案系統提供容錯能力。如果需要進行實時讀寫或者隨機訪問大規模的資料集的時候,會考慮使用HBase。

HBase作為Google Bigtable的開源實現,Google Bigtable利用GFS作為其檔案儲存系統類似,則HBase利用Hadoop HDFS作為其檔案儲存系統;Google透過執行MapReduce來處理Bigtable中的海量資料,同樣,HBase利用Hadoop MapReduce來處理HBase中的海量資料;Google Bigtable利用Chubby作為協同服務,HBase利用Zookeeper作為後設資料的後設資料儲存和容災。在2010年5月,成為apache頂級專案

image-20220608204054001

1.2 HBase處理資料

雖然Hadoop是一個高容錯、高延時的分散式檔案系統和高併發的批處理系統,但是它不適用於提供實時計算;

HBase是可以提供實時計算的分散式資料庫,資料被儲存在HDFS分散式檔案系統上,由HDFS保證期高容錯性;

但是再生產環境中,HBase是如何基於hadoop提供實時性呢?

​ HBase上的資料是以StoreFile(HFile)二進位制流的形式儲存在HDFS上block塊兒中;

​ 但是HDFS並不知道的HBase用於儲存什麼,它只把儲存檔案認為是二進位制檔案,也就是說,HBase的儲存資料對於HDFS檔案系統是透明的。

1.3 HBase與HDFS

在下面的表格中,我們對HDFS與HBase進行比較:

HDFS HBase
HDFS適於儲存大容量檔案的分散式檔案系統。 HBase是建立在HDFS之上的資料庫。
HDFS不支援快速單獨記錄查詢。 HBase提供在較大的錶快速查詢
HDFS提供了高延遲批次處理;沒有批處理概念。 HBase提供了數十億條記錄低延遲訪問單個行記錄(隨機存取)。
HDFS提供的資料只能順序訪問。 HBase內部使用雜湊表和提供隨機接入,並且其儲存索引,可將在HDFS檔案中的資料進行快速查詢。

Hbase--->HashMap

二、HBase相關概念

2.1 分散式資料庫

1、畫圖理解分散式是什麼樣子(region)

2.2 列式儲存

2、畫圖理解列式儲存 拿與mysql(必須項:表+列)中的表做對比(必須項:表+列簇)

2.3 稀疏性

3、畫圖理解稀疏(rowkey)

HBase中需要根據行鍵、列族、列限定符和時間戳來確定一個單元格,因此,可以視為一個“四維座標”,即[行鍵, 列族, 列限定符, 時間戳]

2.4 資料模型

HBase透過表格的模式儲存資料,每個表格由列和行組成,其中,每個列又被劃分為若干個列族(colnum family),請參考下面的圖:

image-20220608214455582

# 三維有序:
1) 一個hbase表中,行鍵之間按照字典順序排序
2)一行中每一個列名之間按照字典順序排序
3)同一個列多個版本號資料,版本之間按照字典順序排序

表:HBase的資料同樣是用表來組織的,表由行和列組成,列分為若干個列族,行和列的座標交叉決定了一個單元格。

行:每個表由若干行組成,每個行有一個行鍵作為這一行的唯一標識。訪問表中的行只有三種方式:透過單個行鍵進行查詢、透過一個行鍵的區間來訪問、全表掃描。

列簇:一個HBase表被分組成許多“列族”的集合,它是基本的訪問控制單元。

列修飾符(列限定符):列族裡的資料透過列限定符(或列)來定位

單元格:在HBase表中,透過行、列族和列限定符確定一個“單元格”(cell),單元格中儲存的資料沒有資料型別,總被視為位元組陣列byte[]

時間戳:每個單元格都儲存著同一份資料的多個版本,這些版本採用時間戳進行索引

2.4.1 Hbase資料模型

HBase將資料存放在帶有標籤的中,表由行和列組成,行和列交叉確定一個單元格,單元格有版本號,版本號自動分配,為資料插入該單元格時的時間戳。單元格的內容沒有資料型別,所有資料都被視為未解釋的位元組陣列

表格中每一行有一個行鍵(也是位元組陣列,任何形式的資料都可以表示成字串,比如資料結構進行序列化之後),整個表根據行鍵的位元組序來排序,所有對錶的訪問必須透過行鍵。

表中的列又劃分為多個列族(column family),同一個列族的所有成員具有相同的字首,具體的列由列修飾符標識,因此,列族和列修飾符合起來才可以表示某一列,比如:info:format、cotents:image

image-20220608215452989

在建立一個表的時候,列族必須作為模式定義的一部分預先給出,而列族是支援動態擴充套件的,也就是列族成員可以隨後按需加入。物理上,所有的列族成員一起存放在檔案系統上,所以實際上說HBase是面向列的資料庫,更準確的應該是面向列族,調優和儲存都是在列族這個層次上進行的。一般情況下,同一個列族的成員最後具有相同的訪問模式和大小特徵。

總結起來,HBase表和我們熟知的RDBMS的表很像,不同之處在於:行按行鍵排序,列劃分為列族,單元格有版本號,沒有資料型別。

2.4.2 Hbase資料座標

HBase中需要根據行鍵、列族、列限定符和時間戳來確定一個單元格(cell),cell中的資料是沒有型別的,全部是位元組碼形式存貯。,因此,可以視為一個“四維座標”,即[行鍵, 列族, 列限定符, 時間戳]

image-20220608215545217

對於上圖這樣一個HBase表,其資料座標舉例如下:

[“201505003”, “Info”, “email”, 1174184619081] “xie@qq.com”
[“201505003”, “Info”, “email”, 1174184620720] “you@163.com”

2.4.3 HBase區域

HBase自動把表水平劃分為區域(Region),每個區域都是有若干連續行構成的,一個區域由所屬的表、起始行、終止行(不包括這行)三個要素來表示。

一開始,一個表只有一個區域,但是隨著資料的增加,區域逐漸變大,等到它超出設定的閾值(128M)大小,就會在某行的邊界上進行拆分,分成兩個大小基本相同的區域。然後隨著資料的再增加,區域就不斷的增加,如果超出了單臺伺服器的容量,就可以把一些區域放到其他節點上去,構成一個叢集。也就是說:叢集中的每個節點(Region Server)管理整個表的若干個區域。所以,我們說:區域是HBase叢集上分佈資料的最小單位

image-20220608215649244

三、HBase系統架構

3.1 架構圖

image-20220608221621833

3.2 元件介紹

HBase由三種型別的伺服器以主從模式構成:

  • Region Server:負責資料的讀寫服務,使用者透過與Region server互動來實現對資料的訪問。
  • HBase HMaster:負責Region的分配及資料庫的建立和刪除等操作。
  • ZooKeeper:負責維護叢集的狀態(某臺伺服器是否線上,伺服器之間資料的同步操作及master的選舉等)。

HDFS的DataNode負責儲存所有Region Server所管理的資料,即HBase中的所有資料都是以HDFS檔案的形式儲存的。出於使Region server所管理的資料更加本地化的考慮,Region server是根據DataNode分佈的。HBase的資料在寫入的時候都儲存在本地。但當某一個region被移除或被重新分配的時候,就可能產生資料不在本地的情況。這種情況只有在所謂的compaction之後才能解決。

Client

包含訪問HBase的介面並維護cache來加快對HBase的訪問

Zookeeper

保證任何時候,叢集中只有一個master

存貯所有Region的定址入口。

實時監控Region server的上線和下線資訊。並實時通知Master

儲存HBase的schema和table後設資料的meta資訊

Master

為Region server分配region

負責Region server的負載均衡

發現失效的Region server並重新分配其上的region

管理使用者對table的增刪改操作

RegionServer

Region server維護region,處理對這些region的IO請求

Region server負責切分在執行過程中變得過大的region 

HLog(WAL log):

HLog檔案就是一個普通的Hadoop Sequence File,Sequence File 的Key是 HLogKey物件,HLogKey中記錄了寫入資料的歸屬資訊,除了table和 region名字外,同時還包括sequence number和timestamp,timestamp是” 寫入時間”,sequence number的起始值為0,或者是最近一次存入檔案系 統sequence number。

HLog SequeceFile的Value是HBase的KeyValue物件,即對應HFile中的 KeyValue

Region

HBase自動把表水平劃分成多個區域(region),每個region會儲存一個表裡面某段連續的資料;每個表一開始只有一個region,隨著資料不斷插 入表,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region(裂變);

當table中的行不斷增多,就會有越來越多的region。這樣一張完整的表被儲存在多個Regionserver上。

Memstore 與 storefile

  1. 一個region由多個store組成,一個store對應一個CF(列簇)

  2. store包括位於記憶體中的memstore和位於磁碟的storefile寫操作先寫入 memstore,當memstore中的資料達到某個閾值,hregionserver會啟動 flashcache程序寫入storefile,每次寫入形成單獨的一個storefile

  3. 當storefile檔案的數量增長到一定閾值後,系統會進行合併(minor、 major compaction),在合併過程中會進行版本合併和刪除工作 (majar),形成更大的storefile。

  4. 當一個region所有storefile的大小和超過一定閾值後,會把當前的region 分割為兩個,並由hmaster分配到相應的regionserver伺服器,實現負載均衡。

  5. 客戶端檢索資料,先在memstore找,找不到再找storefile

  6. HRegion是HBase中分散式儲存和負載均衡的最小單元。最小單元就表 示不同的HRegion可以分佈在不同的HRegion server上。

  7. HRegion由一個或者多個Store組成,每個store儲存一個columns family。

  8. 每個Strore又由一個memStore和0至多個StoreFile組成。

如圖:StoreFile 以HFile格式儲存在HDFS上。

image-20220608221644247

image-20220608221654847

3.3 理解難點

  1、flush重新整理在HDFS上呈現究竟是怎麼重新整理的呢??
    我們目前剛剛學習的時候,新增資料,都是一條一條的put進去,而我們在put的資料比較少(小於128M)的時候,我們put完去HDFS上並未檢視到我們put的檔案,這是因為資料還在記憶體中,也就是還在memStore中,所以要想在HDFS中檢視到,我們必須手動重新整理到磁碟中,這是將memStore的資料重新整理到StoreFile中去,這樣我們在HDFS中就可以檢視到了。  

  2、為什麼Hbase不可以使用像Mysql那樣進行查詢??
    首先,我們應該可以感受到,我們在插入的時候,每行資料,有多少列,列名叫什麼完全是我們自己定義的,之所以不支援像MySql那樣對列進行查詢和操作,因為不確定列的個數和名稱。

  3、資料最後存在HDFS上的,HDFS不支援刪改,為什麼Hbase就可以呢??
    這裡有個思想誤區,的確,資料是以HFile形式存在HDFS上的,而且HDFS的確是不支援刪改的,但是為什麼Hbase就支援呢?首先,這裡的刪除並不是真正意義上的對資料進行刪除,而是對資料進行打上標記,我們再去查的時,就不會查到這個打過標記的資料,這個資料Hmaster會每隔1小時清理。修改是put兩次,Hbase會取最新的資料,過期資料也是這個方式被清理。

四、HBase 2.2.7安裝搭建(詳細可見另一篇搭建文件)

4.1 hbase下載

官網下載地址:https://www.apache.org/dyn/closer.lua/hbase/1.4.6/hbase-1.4.6-bin.tar.gz

image-20220907193935229

4.2 前期準備(Hadoop,zookeeper,jdk)

啟動hadoop

start-all.sh

驗證

http://master:50070

啟動zookeeper(三臺分別啟動)

zkServer.sh start

檢查狀態

zkServer.sh status

4.3 搭建Hbase

1、上傳解壓

tar -zxvf hbase-1.4.6-bin.tar.gz

2、配置環境變數

export HBASE_HOME=/usr/local/soft/hbase-1.4.6

$HBASE_HOME/bin

source /etc/profile

3、修改hbase-env.sh檔案

增加java配置

export JAVA_HOME=/usr/local/soft/jdk1.8.0_171

關閉預設zk配置(原本是註釋的,放開修改false)

export HBASE_MANAGES_ZK=false

4、修改hbase-site.xml檔案

# 增加以下配置
<!--指定 zookeeper 伺服器 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,node1,node2</value>
</property>

<!--指定 hbase 根路徑 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>

<!--將 hbase 設定為分散式部署。有 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>

<!-- 避免出現啟動錯誤。 有-->
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property> 

5、修改regionservers檔案

如果是偽分散式版本,增加master即可

node1
node2

6、同步到所有節點(如果是偽分散式不需要同步)

scp -r hbase-1.4.6 node1:`pwd`
scp -r hbase-1.4.6 node2:`pwd`

7、啟動hbase叢集 , 在master上執行

start-hbase.sh

image-20220608224430921

8、驗證hbase

http://master:16010

image-20220608224544266

hbase日誌檔案所在的目錄: /usr/local/soft/hbase-1.7.1/logs

9、關閉叢集的命令

stop-hbase.sh

4.4 啟動順序

啟動順序
Hadoop及hbase叢集啟動順序 zookeepeer -> hadoop -> hbase

停止順序
Hadoop及hbase叢集關閉順序 hbase -> hadoop -> zookeepeer

4.5 重置hbase

1、關閉hbase叢集
   1)殺死程序
   
   2)stop-hbase.sh
2、刪除資料 hdfs
hdfs dfs -rmr /hbase
3、刪除後設資料 zk
   zkCli.sh
   rmr /hbase
4、重新啟動hbase
   start-hbase.sh
時間同步
yum install ntp -y

ntpdate -u time.windows.com

五、hbase shell

命名 描述 語法
help ‘命名名’ 檢視命令的使用描述 help ‘命令名’
whoami 我是誰 whoami
version 返回hbase版本資訊 version
status 返回hbase叢集的狀態資訊 status
table_help 檢視如何操作表 table_help
create 建立表 create ‘表名’, ‘列族名1’, ‘列族名2’, ‘列族名N’
alter 修改列族 新增一個列族:alter ‘表名’, ‘列族名’
刪除列族:alter ‘表名’,
describe 顯示錶相關的詳細資訊 describe ‘表名’
list 列出hbase中存在的所有表 list
exists 測試表是否存在 exists ‘表名’
put 新增或修改的表的值 put ‘表名’, ‘行鍵’, ‘列族名’, ‘列值’
put ‘表名’, ‘行鍵’, ‘列族名:列名’, ‘列值’
scan 透過對錶的掃描來獲取對用的值 scan ‘表名’
掃描某個列族: scan ‘表名’, {COLUMN=>‘列族名’}
掃描某個列族的某個列: scan ‘表名’, {COLUMN=>‘列族名:列名’}
查詢同一個列族的多個列: scan ‘表名’,
get 獲取行或單元(cell)的值 get ‘表名’, ‘行鍵’
get ‘表名’, ‘行鍵’, ‘列族名’
count 統計表中行的數量 count ‘表名’
incr 增加指定錶行或列的值 incr ‘表名’, ‘行鍵’, ‘列族:列名’, 步長值
get_counter 獲取計數器 get_counter ‘表名’, ‘行鍵’, ‘列族:列名’
delete 刪除指定物件的值(可以為表,行,列對應的值,另外也可以指定時間戳的值) 刪除列族的某個列: delete ‘表名’, ‘行鍵’, ‘列族名:列名’
deleteall 刪除指定行的所有元素值 deleteall ‘表名’, ‘行鍵’
truncate 重新建立指定表 truncate ‘表名’
enable 使表有效 enable ‘表名’
is_enabled 是否啟用 is_enabled ‘表名’
disable 使表無效 disable ‘表名’
is_disabled 是否無效 is_disabled ‘表名’
drop 刪除表 drop的表必須是disable的
disable ‘表名’
drop ‘表名’
shutdown 關閉hbase叢集(與exit不同)
tools 列出hbase所支援的工具
exit 退出hbase shell

HBase Shell 是官方提供的一組命令,用於操作HBase。如果配置了HBase的環境變數了,就可以知己在命令列中輸入hbase shell 命令進入命令列。

hbase shell

image-20220608225844374

在hbase中如果輸入錯誤,按住ctrl+退格 才能刪除(新版本不用)

5.1 help命令

可以透過 help '命名名稱'來檢視命令列的具體使用,包括命令的作用和用法。
透過help ‘hbase’ 命名來檢視hbase shell 支援的所有命令,hbase將命令進行分組,其中ddl、dml使用較多。

image-20220608230009607

help 'list'

image-20220608230050274

5.2 general 類

5.2.1 顯示叢集狀態status

image-20220608230310182

5.2.2 查詢資料庫版本version

image-20220608230440754

5.2.3 顯示當前使用者與組 whoami

image-20220608230519490

5.2.4 檢視操作表的命令table_help

image-20220608230553346

5.2.5 退出HBase Shell exit

image-20220608230623889

5.3 DDL相關

5.3.1. 建立表create

注意:建立表時只需要指定列族名稱,不需要指定列名。

# 語法
create '表名', {NAME => '列族名1'}, {NAME => '列族名2'}, {NAME => '列族名3'}
# 此種方式是上上面的簡寫方式,使用上面方式可以為列族指定更多的屬性,如VERSIONS、TTL、BLOCKCACHE、CONFIGURATION等屬性
create '表名', '列族名1', '列族名2', '列族名3'

create '表名', {NAME => '列族名1', VERSIONS => 版本號, TTL => 過期時間, BLOCKCACHE => true}


# 示例
create 'tbl_user', 'info', 'detail'
create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true},{NAME => 'f2',..}

image-20220608230826425

5.3.2 修改(新增、刪除)表結構Schema alter

5.3.2.1 新增一個列簇
# 語法 
alter '表名', '列族名'

# 示例
alter 'tbl_user', 'address'

image-20220608230938763

5.3.2.2 刪除一個列簇
# 語法 
alter '表名', {NAME=> '列族名', METHOD=> 'delete'}

alter 't1',{NAME => 'cf2', METHOD => 'delete'}
# 示例
alter 'tbl_user', {NAME=> 'address', METHOD=> 'delete'}

image-20220608231027899

5.3.2.3 修改列族的屬性

可以修改列族的VERSIONS、IN_MEMORY

# 修改f1列族的版本為5
alter 't1', NAME => 'f1', VERSIONS => 5

# 修改多個列族,修改f2為記憶體,版本號為5
alter 't1', 'f1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5}

# 也可以修改table-scope屬性,例如MAX_FILESIZE, READONLY,MEMSTORE_FLUSHSIZE, DEFERRED_LOG_FLUSH等。
# 例如,修改region的最大大小為128MB:
alter 't1', MAX_FILESIZE => '134217728'

5.3.3 獲取表的描述describe

# 語法 
describe '表名'

# 示例
describe 'tbl_user'

image-20220608231308673

5.3.4 列舉所有表list

image-20220608231334575

5.3.5 表是否存在exists

# 語法 
exists '表名'

# 示例
exists 'tbl_user'

image-20220608231431898

5.3.6 啟用表enable和禁用表disable

透過enable和disable來啟用/禁用這個表,相應的可以透過is_enabled和is_disabled來檢查表是否被禁用。

# 語法
enable '表名'
is_enabled '表名'

disable '表名'
is_disabled '表名'

# 示例
disable 'tbl_user'
is_disabled 'tbl_user'

enable 'tbl_user'
is_enabled 'tbl_user'

5.3.7 禁用滿足正規表示式的所有表disable_all

  • .匹配除“\n”和"\r"之外的任何單個字元
  • *匹配前面的子表示式任意次
# 匹配以t開頭的表名
disable_all 't.*'
# 匹配指定名稱空間ns下的以t開頭的所有表
disable_all 'ns:t.*'
# 匹配ns名稱空間下的所有表
disable_all 'ns:.*'

5.3.8 啟用滿足正規表示式的所有表enable_all

enable_all 't.*'
enable_all 'ns:t.*'
enable_all 'ns:.*'

5.3.9 刪除表drop

需要先禁用表,然後再刪除表,啟用的表是不允許刪除的

# 語法
disable '表名'
drop '表名'

# 示例
disable 'tbl_user'
drop 'tbl_user'

直接刪除報錯:

image-20220608231641417

先禁用後刪除

image-20220608231726087

5.3.10 刪除滿足正規表示式的所有表drop_all

drop_all 't.*'
drop_all 'ns:t.*'
drop_all 'ns:.*'

5.3.11 獲取某個表賦值給一個變數 get_table

透過 var = get_table ‘表名’ 賦值給一個變數物件,然後物件.來呼叫,就像物件導向程式設計一樣,透過物件.方法來呼叫,這種方式在操作某個表時就不必每次列舉表名了。

image-20220608232059349

5.3.12 獲取rowKey所在的區 locate_region

locate_region '表名', '行鍵'

5.3.13 顯示hbase所支援的所有過濾器show_filters

過濾器用於get和scan命令中作為篩選資料的條件,型別關係型資料庫中的where的作用

image-20220608232227422

5.4 namespace

hbase中沒有資料庫的概念 , 可以使用namespace來達到資料庫分類別管理表的作用

5.4.1 列舉名稱空間 list_namespace

image-20220608232407636

5.4.2 獲取名稱空間描述 describe_namespace

describe_namespace 'default'

image-20220608232448689

5.4.3 檢視名稱空間下的所有表 list_namespace_tables

list_namespace_tables 'default'

list_namespace_tables 'hbase'

image-20220608232555107

5.4.4 建立名稱空間create_namespace

create_namespace 'bigdata17'

5.4.5 刪除名稱空間drop_namespace

drop_namespace '名稱空間名稱'

5.5 DML

5.5.1 插入或者修改資料put

image-20220608232846139

# 語法
# 當列族中只有一個列時'列族名:列名'使用'列族名'
put '表名', '行鍵', '列族名', '列值'
put '表名', '行鍵', '列族名:列名', '列值'

# 示例

# 建立表
create 'users', 'info', 'detail', 'address'

# 第一行資料
put 'users', 'mengday', 'info:id', '1'
put 'users', 'mengday', 'info:name', '張三'
put 'users', 'mengday', 'info:age', '28'
put 'users', 'mengday', 'detail:birthday', '1990-06-26'
put 'users', 'mengday', 'detail:email', 'abc@163.com'
put 'users', 'mengday', 'detail:create_time', '2019-03-04 14:26:10'
put 'users', 'mengday', 'address', '上海市'

# 第二行資料
put 'users', 'vbridbest', 'info:id', '2'
put 'users', 'vbridbest', 'info:name', '李四'
put 'users', 'vbridbest', 'info:age', '27'
put 'users', 'vbridbest', 'detail:birthday', '1990-06-27'
put 'users', 'vbridbest', 'detail:email', 'xxx@gmail.com'
put 'users', 'vbridbest', 'detail:create_time', '2019-03-05 14:26:10'
put 'users', 'vbridbest', 'address', '北京市'


# 第三行資料
put 'users', 'xiaoming', 'info:id', '3'
put 'users', 'xiaoming', 'info:name', '王五'
put 'users', 'xiaoming', 'info:age', '26'
put 'users', 'xiaoming', 'detail:birthday', '1990-06-28'
put 'users', 'xiaoming', 'detail:email', 'xyz@qq.com'
put 'users', 'xiaoming', 'detail:create_time', '2019-03-06 14:26:10'
put 'users', 'xiaoming', 'address', '杭州市'

put 'users', 'apple', 'info:id', '4'
put 'users', 'apple', 'info:name', '李剛'
put 'users', 'apple', 'info:age', '26'
put 'users', 'apple', 'detail:birthday', '1991-06-28'
put 'users', 'apple', 'detail:email', 'lg@qq.com'
put 'users', 'apple', 'detail:create_time', '2024-03-06 14:26:10'
put 'users', 'apple', 'address', '合肥市'

5.5.2 全表掃描scan

# 語法
scan '表名'

# 示例
scan 'users'   // 效果類似於sql語句中select * from users

image-20220608233212478

掃描整個列簇

# 語法
scan '表名', {COLUMN=>'列族名'}

# 示例
scan 'users', {COLUMN=>'info'}

掃描整個列簇的某個列

# 語法
scan '表名', {COLUMN=>'列族名:列名'}

# 示例
scan 'users', {COLUMN=>'info:age'}

5.5.3 獲取資料get

# 語法
get '表名', '行鍵'

# 示例
get 'users', 'xiaoming'

根據某一行某列族的資料

# 語法
get '表名', '行鍵', '列族名'

# 示例
get 'users', 'xiaoming', 'info'
# 建立表,c1版本為4, 後設資料mykey=myvalue
hbase(main):009:0> create 'test1', {NAME => 'cf1', VERSIONS => 4}
0 row(s) in 2.2810 seconds

=> Hbase::Table - t1
# 新增列族c2, c3
hbase(main):010:0> alter 't1', 'c2', 'c3'
Updating all regions with the new schema...
1/1 regions updated.
Done.
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 3.8320 seconds

# 出入資料,c1 插入4個版本的值
hbase(main):011:0> put 't1', 'r1', 'c1', 'v1'
0 row(s) in 0.1000 seconds

hbase(main):012:0> put 't1', 'r1', 'c1', 'v11'
0 row(s) in 0.0180 seconds

hbase(main):013:0> put 't1', 'r1', 'c1', 'v111'
0 row(s) in 0.0140 seconds

hbase(main):014:0> put 't1', 'r1', 'c1', 'v1111'
0 row(s) in 0.0140 seconds

# 插入c2、c3的值
hbase(main):015:0> put 't1', 'r1', 'c2', 'v2'
0 row(s) in 0.0140 seconds

hbase(main):016:0> put 't1', 'r1', 'c3', 'v3'
0 row(s) in 0.0210 seconds

# 獲取rowKey=r1的一行記錄
hbase(main):017:0> get 't1', 'r1'
COLUMN                                              CELL
 c1:                                                timestamp=1552819382575, value=v1111
 c2:                                                timestamp=1552819392398, value=v2
 c3:                                                timestamp=1552819398244, value=v3
3 row(s) in 0.0550 seconds

# 獲取rowKey=r1並且 1552819392398 <= 時間戳範圍 < 1552819398244
hbase(main):018:0> get 't1', 'r1', {TIMERANGE => [1552819392398, 1552819398244]}
COLUMN                                              CELL
 c2:                                                timestamp=1552819392398, value=v2
1 row(s) in 0.0090 seconds

# 獲取指定列的值
hbase(main):019:0> get 't1', 'r1', {COLUMN => 'c1'}
COLUMN                                              CELL
 c1:                                                timestamp=1552819382575, value=v1111
1 row(s) in 0.0160 seconds

# 獲取指定列的值,多個值使用陣列表示
hbase(main):020:0> get 't1', 'r1', {COLUMN => ['c1', 'c2', 'c3']}
COLUMN                                              CELL
 c1:                                                timestamp=1552819382575, value=v1111
 c2:                                                timestamp=1552819392398, value=v2
 c3:                                                timestamp=1552819398244, value=v3
3 row(s) in 0.0170 seconds

# 獲取c1的值,獲取4個版本的值,預設是按照時間戳降續排序的
hbase(main):021:0> get 't1', 'r1', {COLUMN => 'c1', VERSIONS => 4}
COLUMN                                              CELL
 c1:                                                timestamp=1552819382575, value=v1111
 c1:                                                timestamp=1552819376343, value=v111
 c1:                                                timestamp=1552819368993, value=v11
 c1:                                                timestamp=1552819362975, value=v1
4 row(s) in 0.0180 seconds

# 獲取c1的3個版本值
hbase(main):027:0* get 't1', 'r1', {COLUMN => 'c1', VERSIONS => 3}
COLUMN                                               CELL
 c1:                                                 timestamp=1552819382575, value=v1111
 c1:                                                 timestamp=1552819376343, value=v111
 c1:                                                 timestamp=1552819368993, value=v11
3 row(s) in 0.0090 seconds

# 獲取指定時間戳版本的列
hbase(main):022:0> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => 1552819376343}
COLUMN                                              CELL
 c1:                                                timestamp=1552819376343, value=v111
1 row(s) in 0.0170 seconds

hbase(main):023:0> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => 1552819376343, VERSIONS => 4}
COLUMN                                              CELL
 c1:                                                timestamp=1552819376343, value=v111
1 row(s) in 0.0130 seconds

# 獲取rowKey=r1中的值等於v2的所有列
hbase(main):024:0> get 't1', 'r1', {FILTER => "ValueFilter(=, 'binary:v2')"}
COLUMN                                              CELL
 c2:                                                timestamp=1552819392398, value=v2
1 row(s) in 0.0510 seconds


hbase(main):025:0> get 't1', 'r1', {COLUMN => 'c1', ATTRIBUTES => {'mykey'=>'myvalue'}}
COLUMN                                              CELL
 c1:                                                timestamp=1552819382575, value=v1111
1 row(s) in 0.0100 seconds

5.5.4 刪除某個列族中的某個列delete

# 語法
delete '表名', '行鍵', '列族名:列名'

delete 'users','xiaoming','info:age'

create 'tbl_test', 'columnFamily1'

put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column2', 'value2'

delete 'tbl_test', 'rowKey1', 'columnFamily1:column1'

5.5.5 刪除某行資料deleteall

# 語法
deleteall '表名', '行鍵'

# 示例
deleteall 'users', 'xiaoming'

5.5.6 清空整個表的資料truncate

先disable表,然後再drop表,最後重新create表

truncate '表名'

image-20220608233602414

5.5.7 自增incr

# 語法
incr '表名', '行鍵', '列族:列名', 步長值

# 示例 
# 注意:incr 可以對不存的行鍵操作,如果行鍵已經存在會報錯,如果使用put修改了incr的值再使用incr也會報錯
# ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Field is not a long, it's 2 bytes wide
incr 'tbl_user', 'xiaohong', 'info:age', 1

image-20220608233701046

5.5.8 計數器get_counter

# 點選量:日、周、月
create 'counters', 'daily', 'weekly', 'monthly'
incr 'counters', '20240415', 'daily:hits', 1
incr 'counters', '20110101', 'daily:hits', 1
get_counter 'counters', '20110101', 'daily:hits'

5.5.9 修飾詞

1、修飾詞
# 語法
scan '表名', {COLUMNS => [ '列族名1:列名1', '列族名1:列名2', ...]}

# 示例
scan 'tbl_user', {COLUMNS => [ 'info:id', 'info:age']}
2、TIMESTAMP 指定時間戳
# 語法
scan '表名',{TIMERANGE=>[timestamp1, timestamp2]}

# 示例
scan 'tbl_user',{TIMERANGE=>[1551938004321, 1551938036450]}
3、VERSIONS

預設情況下一個列只能儲存一個資料,後面如果修改資料就會將原來的覆蓋掉,可以透過指定VERSIONS時HBase一列能儲存多個值。

create 'tbl_test', 'columnFamily1'
describe 'tbl_test'

# 修改列族版本號
alter 'tbl_test', { NAME=>'columnFamily1', VERSIONS=>3 }

put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value2'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value3'

# 預設返回最新的一條資料
get 'tbl_test','rowKey1','columnFamily1:column1'

# 返回3個
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>3}
# 返回2個
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>2}
4、STARTROW

ROWKEY起始行。會先根據這個key定位到region,再向後掃描

# 語法
scan '表名', { STARTROW => '行鍵名'}

# 示例
scan 'tbl_user', { STARTROW => 'vbirdbest'}
5、STOPROW :截止到STOPROW行,STOPROW行之前的資料,不包括STOPROW這行資料
# 語法
scan '表名', { STOPROW => '行鍵名'}

# 示例
scan 'tbl_user', { STOPROW => 'xiaoming'}
6、LIMIT 返回的行數
# 語法
scan '表名', { LIMIT => 行數}

# 示例
scan 'tbl_user', { LIMIT => 2 }

5.5.10 FILTER條件過濾器

過濾器之間可以使用AND、OR連線多個過濾器。

1、ValueFilter 值過濾器
# 語法:binary 等於某個值
scan '表名', FILTER=>"ValueFilter(=,'binary:列值')"
# 語法 substring:包含某個值
scan '表名', FILTER=>"ValueFilter(=,'substring:列值')"

# 示例
scan 'tbl_user', FILTER=>"ValueFilter(=, 'binary:26')"
scan 'tbl_user', FILTER=>"ValueFilter(=, 'substring:6')"
2、ColumnPrefixFilter 列名字首過濾器
# 語法 substring:包含某個值
scan '表名', FILTER=>"ColumnPrefixFilter('列名字首')"

# 示例
scan 'tbl_user', FILTER=>"ColumnPrefixFilter('birth')"
# 透過括號、AND和OR的條件組合多個過濾器
scan 'tbl_user', FILTER=>"ColumnPrefixFilter('birth') AND ValueFilter(=,'substring:26')"
3、rowKey字典排序

Table中的所有行都是按照row key的字典排序的

image-20220608234458949

相關文章