HBase架構與基礎命令
一、瞭解HBase
官方文件:https://hbase.apache.org/
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頂級專案
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),請參考下面的圖:
# 三維有序:
1) 一個hbase表中,行鍵之間按照字典順序排序
2)一行中每一個列名之間按照字典順序排序
3)同一個列多個版本號資料,版本之間按照字典順序排序
表:HBase的資料同樣是用表來組織的,表由行和列組成,列分為若干個列族,行和列的座標交叉決定了一個單元格。
行:每個表由若干行組成,每個行有一個行鍵作為這一行的唯一標識。訪問表中的行只有三種方式:透過單個行鍵進行查詢、透過一個行鍵的區間來訪問、全表掃描。
列簇:一個HBase表被分組成許多“列族”的集合,它是基本的訪問控制單元。
列修飾符(列限定符):列族裡的資料透過列限定符(或列)來定位
單元格:在HBase表中,透過行、列族和列限定符確定一個“單元格”(cell),單元格中儲存的資料沒有資料型別,總被視為位元組陣列byte[]
時間戳:每個單元格都儲存著同一份資料的多個版本,這些版本採用時間戳進行索引
2.4.1 Hbase資料模型
HBase將資料存放在帶有標籤的表中,表由行和列組成,行和列交叉確定一個單元格,單元格有版本號,版本號自動分配,為資料插入該單元格時的時間戳。單元格的內容沒有資料型別,所有資料都被視為未解釋的位元組陣列。
表格中每一行有一個行鍵(也是位元組陣列,任何形式的資料都可以表示成字串,比如資料結構進行序列化之後),整個表根據行鍵的位元組序來排序,所有對錶的訪問必須透過行鍵。
表中的列又劃分為多個列族(column family),同一個列族的所有成員具有相同的字首,具體的列由列修飾符標識,因此,列族和列修飾符合起來才可以表示某一列,比如:info:format、cotents:image
在建立一個表的時候,列族必須作為模式定義的一部分預先給出,而列族是支援動態擴充套件的,也就是列族成員可以隨後按需加入。物理上,所有的列族成員一起存放在檔案系統上,所以實際上說HBase是面向列的資料庫,更準確的應該是面向列族,調優和儲存都是在列族這個層次上進行的。一般情況下,同一個列族的成員最後具有相同的訪問模式和大小特徵。
總結起來,HBase表和我們熟知的RDBMS的表很像,不同之處在於:行按行鍵排序,列劃分為列族,單元格有版本號,沒有資料型別。
2.4.2 Hbase資料座標
HBase中需要根據行鍵、列族、列限定符和時間戳來確定一個單元格(cell),cell中的資料是沒有型別的,全部是位元組碼形式存貯。,因此,可以視為一個“四維座標”,即[行鍵, 列族, 列限定符, 時間戳]。
對於上圖這樣一個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叢集上分佈資料的最小單位。
三、HBase系統架構
3.1 架構圖
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
一個region由多個store組成,一個store對應一個CF(列簇)
store包括位於記憶體中的memstore和位於磁碟的storefile寫操作先寫入 memstore,當memstore中的資料達到某個閾值,hregionserver會啟動 flashcache程序寫入storefile,每次寫入形成單獨的一個storefile
當storefile檔案的數量增長到一定閾值後,系統會進行合併(minor、 major compaction),在合併過程中會進行版本合併和刪除工作 (majar),形成更大的storefile。
當一個region所有storefile的大小和超過一定閾值後,會把當前的region 分割為兩個,並由hmaster分配到相應的regionserver伺服器,實現負載均衡。
客戶端檢索資料,先在memstore找,找不到再找storefile
HRegion是HBase中分散式儲存和負載均衡的最小單元。最小單元就表 示不同的HRegion可以分佈在不同的HRegion server上。
HRegion由一個或者多個Store組成,每個store儲存一個columns family。
每個Strore又由一個memStore和0至多個StoreFile組成。
如圖:StoreFile 以HFile格式儲存在HDFS上。
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
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
8、驗證hbase
http://master:16010
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
在hbase中如果輸入錯誤,按住ctrl+退格 才能刪除(新版本不用)
5.1 help命令
可以透過
help '命名名稱'
來檢視命令列的具體使用,包括命令的作用和用法。
透過help ‘hbase’ 命名來檢視hbase shell 支援的所有命令,hbase將命令進行分組,其中ddl、dml使用較多。
help 'list'
5.2 general 類
5.2.1 顯示叢集狀態status
5.2.2 查詢資料庫版本version
5.2.3 顯示當前使用者與組 whoami
5.2.4 檢視操作表的命令table_help
5.2.5 退出HBase Shell exit
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',..}
5.3.2 修改(新增、刪除)表結構Schema alter
5.3.2.1 新增一個列簇
# 語法
alter '表名', '列族名'
# 示例
alter 'tbl_user', 'address'
5.3.2.2 刪除一個列簇
# 語法
alter '表名', {NAME=> '列族名', METHOD=> 'delete'}
alter 't1',{NAME => 'cf2', METHOD => 'delete'}
# 示例
alter 'tbl_user', {NAME=> 'address', METHOD=> 'delete'}
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'
5.3.4 列舉所有表list
5.3.5 表是否存在exists
# 語法
exists '表名'
# 示例
exists 'tbl_user'
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'
直接刪除報錯:
先禁用後刪除
5.3.10 刪除滿足正規表示式的所有表drop_all
drop_all 't.*'
drop_all 'ns:t.*'
drop_all 'ns:.*'
5.3.11 獲取某個表賦值給一個變數 get_table
透過 var = get_table ‘表名’ 賦值給一個變數物件,然後物件.來呼叫,就像物件導向程式設計一樣,透過物件.方法來呼叫,這種方式在操作某個表時就不必每次列舉表名了。
5.3.12 獲取rowKey所在的區 locate_region
locate_region '表名', '行鍵'
5.3.13 顯示hbase所支援的所有過濾器show_filters
過濾器用於get和scan命令中作為篩選資料的條件,型別關係型資料庫中的where的作用
5.4 namespace
hbase中沒有資料庫的概念 , 可以使用namespace來達到資料庫分類別管理表的作用
5.4.1 列舉名稱空間 list_namespace
5.4.2 獲取名稱空間描述 describe_namespace
describe_namespace 'default'
5.4.3 檢視名稱空間下的所有表 list_namespace_tables
list_namespace_tables 'default'
list_namespace_tables 'hbase'
5.4.4 建立名稱空間create_namespace
create_namespace 'bigdata17'
5.4.5 刪除名稱空間drop_namespace
drop_namespace '名稱空間名稱'
5.5 DML
5.5.1 插入或者修改資料put
# 語法
# 當列族中只有一個列時'列族名:列名'使用'列族名'
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
掃描整個列簇
# 語法
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 '表名'
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
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的字典排序的