HBase(1/5)
HBase學習(一)
一、了解HBase
官方文檔://hbase.apache.org/book.html
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),請參考下面的圖:
表: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] | 「[email protected]」 |
[「201505003」, 「Info」, 「email」, 1174184620720] | 「[email protected]」 |
2.4.3 HBase區域
HBase自動把表水平劃分為區域(Region),每個區域都是有若干連續行構成的,一個區域由所屬的表、起始行、終止行(不包括這行)三個要素來表示。
一開始,一個表只有一個區域,但是隨著數據的增加,區域逐漸變大,等到它超出設定的閾值大小,就會在某行的邊界上進行拆分,分成兩個大小基本相同的區域。然後隨著數據的再增加,區域就不斷的增加,如果超出了單台伺服器的容量,就可以把一些區域放到其他節點上去,構成一個集群。也就是說:集群中的每個節點(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元數據
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會取最新的數據,過期數據也是這個方式被清理。
四、HBase1.4.6安裝搭建
4.1 hbase下載
官網下載地址://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
驗證
//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文件
<property> <name>hbase.rootdir</name> <value>hdfs://master01:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>node1,node2,master01</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
//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 『表名』, {NAME=> 『列族名』, METHOD=> 『delete』} |
describe | 顯示錶相關的詳細資訊 | describe 『表名』 |
list | 列出hbase中存在的所有表 | list |
exists | 測試表是否存在 | exists 『表名』 |
put | 添加或修改的表的值 | put 『表名』, 『行鍵』, 『列族名』, 『列值』 put 『表名』, 『行鍵』, 『列族名:列名』, 『列值』 |
scan | 通過對錶的掃描來獲取對用的值 | scan 『表名』 掃描某個列族: scan 『表名』, {COLUMN=>『列族名』} 掃描某個列族的某個列: scan 『表名』, {COLUMN=>『列族名:列名』} 查詢同一個列族的多個列: scan 『表名』, {COLUMNS => [ 『列族名1:列名1』, 『列族名1:列名2』, …]} |
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}
5.3.2 修改(添加、刪除)表結構Schema alter
5.3.2.1 添加一個列簇
# 語法 alter '表名', '列族名' # 示例 alter 'tbl_user', 'address'
5.3.2.2 刪除一個列簇
# 語法 alter '表名', {NAME=> '列族名', 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', 'rk1001', 'info:id', '1' put 'users', 'rk1001', 'info:name', '張三' put 'users', 'rk1001', 'info:age', '28' put 'users', 'rk1001', 'detail:birthday', '1990-06-26' put 'users', 'rk1001', 'detail:email', '[email protected]' put 'users', 'rk1001', 'detail:create_time', '2019-03-04 14:26:10' put 'users', 'rk1001', 'address', '上海市' # 第二行數據 put 'users', 'rk1002', 'info:id', '2' put 'users', 'rk1002', 'info:name', '李四' put 'users', 'rk1002', 'info:age', '27' put 'users', 'rk1002', 'detail:birthday', '1990-06-27' put 'users', 'rk1002', 'detail:email', '[email protected]' put 'users', 'rk1002', 'detail:create_time', '2019-03-05 14:26:10' put 'users', 'rk1002', 'address', '北京市' # 第三行數據 put 'users', 'rk1003', 'info:id', '3' put 'users', 'rk1003', 'info:name', '王五' put 'users', 'rk1003', 'info:age', '26' put 'users', 'rk1003', 'detail:birthday', '1990-06-28' put 'users', 'rk1003', 'detail:email', '[email protected]' put 'users', 'rk1003', 'detail:create_time', '2019-03-06 14:26:10' put 'users', 'rk1003', 'address', '杭州市'
5.5.2 全表掃描scan
# 語法 scan '表名' # 示例 scan '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 't1', {NAME => 'c1', VERSIONS => 4}, METADATA => { 'mykey' => 'myvalue' } 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', '20110101', '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的字典排序的