《HBase 不睡覺書》是一本讓人看了不會睡着的 HBase 技術書籍,寫的很是不錯,爲了加深記憶,決定把書中重要的部分整理成讀書筆記,便於後期查閱,同時但願爲初學 HBase 的同窗帶來一些幫助。shell
本文主要介紹 hbase shell 的使用。數據庫
通常的數據庫都有命令行工具,HBase 也自帶了一個用 JRuby(JRuby 是用 Java 寫的 Ruby 解釋器)寫的 shell 命令行工具,執行如下命令來進入 HBase 的 shell:編程
# 通常集羣安裝好能夠直接使用 hbase shell 啓動
$ HBASE_HOME/bin/hbase shell
複製代碼
新建表須要注意的幾點:bash
可用經過下面的命令新建一個表:併發
# 新建一個表 'test',包含了一個列族 'cf'
# HBase 新建表時,至少須要一個列族
create 'test', 'cf'
複製代碼
用list命令能夠看到整個庫中有哪些表:工具
hbase(main):010:0> list
TABLE
test
test1
test3
3 row(s)
Took 0.0048 seconds
=> ["test", "test1", "test3"]
複製代碼
用 describe 命令查看錶的元信息:post
hbase(main):018:0> describe "test"
Table test is ENABLED
test
COLUMN FAMILIES DESCRIPTION
{
NAME => 'cf',
VERSIONS => '1',
EVICT_BLOCKS_ON_CLOSE => 'false',
NEW_VERSION_BEHAVIOR => 'false',
KEEP_DELETED_CELLS => 'FALSE',
CACHE_DATA_ON_WRITE => 'false',
DATA_BLOCK_ENCODING => 'NONE',
TTL => 'FOREVER',
MIN_VERSIONS => '0',
REPLICATION_SCOPE => '0',
BLOOMFILTER => 'ROW',
CACHE_INDEX_ON_WRITE => 'false',
IN_MEMORY => 'false',
CACHE_BLOOMS_ON_WRITE => 'false',
PREFETCH_BLOCKS_ON_OPEN => 'false',
COMPRESSION => 'NONE',
BLOCKCACHE => 'true',
BLOCKSIZE => '65536'
}
1 row(s)
Took 0.0504 seconds
複製代碼
能夠看到,默認是沒有設置壓縮和數據塊編碼。性能
在刪除 HBase 表以前的時候,必須先執行停用(disable)命令,由於可能有不少客戶端如今正好連着,並且也有可能 HBase 正在作合併或者分裂操做。若是你這時刪除了表,會形成沒法恢復的錯誤,HBase 也不會讓你直接就刪除表,而是須要先作一個 disable 操做,意思是把這個錶停用掉,而且下線。ui
hbase(main):019:0> disable "test"
Took 0.8052 seconds
hbase(main):020:0> drop "test"
Took 0.4512 seconds
hbase(main):021:0>
複製代碼
在沒有什麼數據或者沒有什麼人使用的狀況下 disable 命令執行得很快,但若是在系統已經上線了,而且負載很大的狀況下 disable 命令會執行得很慢,由於 disable 要通知全部的 RegionServer 來下線這個表,而且有不少涉及該表的操做須要被停用掉,以保證該表真的已經徹底不參與任何工做了。編碼
可使用 alter 命令對錶進行修改,修改時無需禁用表,可是強烈建議在生產環境下執行這個命令以前,最好先停用(disable)這個表。由於對列族的全部操做都會同步到 全部擁有這個表的 RegionServer 上,當有不少客戶端都在連着的時候,直接新增一個列族對性能的影響較大(還有可能出現意外的問題)。
# 修改多個屬性
alter 't1', 'f1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5}
# 新增列族
alter 't1', 'cf2'
# 刪除列族
alter 't1', NAME => 'f1', METHOD => 'delete'
複製代碼
HBase 中行的每個列都存儲在不一樣的位置,插入數據時必須指定要存儲在哪一個單元格;而單元格須要根據表、行、列這幾個維度來定位,所以插入數據的時候必須指定把數據插入到哪一個表的哪一個列族的哪一個行的哪一個列,例如:
hbase(main):024:0> put 'test1','row1','cf:name','jack'
Took 0.0838 seconds
hbase(main):025:0> scan 'test1'
ROW COLUMN+CELL
row1 column=cf:name, timestamp=1543161899520, value=jack
1 row(s)
Took 0.0301 seconds
複製代碼
向 test 表插入一個單元格,這個單元格的 rowkey 爲 row1,該單元格的列族爲 cf,該單元格的列名爲 name,數據值爲 jack。
插入成功後,使用 scan 命令查看錶中數據,能夠看到表中有一條記錄,ROW 列顯示的就是 rowkey,COLUMN+CELL 顯示的就是這個記錄的具體列族(column 裏面冒號前面的 部分)、列(colum 裏面冒號後面的部分)、時間戳(timestamp)、值(value)信息。
get 只能查詢一個單元格的記錄,在表的數據很大的時候,get 查詢的速度遠遠高於 scan。
get 'test','row7',{COLUMN=>'cf:name',VERSIONS=>5}
COLUMN CELL
cf:name timestamp=3, value=wangwu
cf:name timestamp=2, value=lisi
cf:name timestamp=1, value=zhangsan
複製代碼
Scan 是最經常使用的查詢表數據的命令,這個命令至關於傳統數據庫的 select。在 HBase 中咱們用起始行(STARTROW)和結束行(ENDROW)來限制顯示記錄的條數。
STARTROW 和 ENDROW 都是可選的參數,能夠不輸入。若是 ENDROW 不輸入的話,就從 STARTROW 開始一直顯示下去直到表的結尾;若是 STARTROW 不輸入的話,就從表頭一直顯示到 ENDROW 爲止。
scan 'test',{STARTROW=>'row3'}
ROW COLUMN+CELL
row3 column=cf:name, timestamp=1471112677398, value=alex
row4 column=cf:name, timestamp=1471112686290, value=jim
scan 'test',{ENDROW=>'row4'}
ROW COLUMN+CELL
row2 column=cf:name, timestamp=2222222222222, value=billy
row3 column=cf:name, timestamp=1471112677398, value=alex
複製代碼
刪除表數據可使用 delete 命令:
# 刪除某一單元格數據
delete 'test','row4','cf:name'
# 根據版本刪除數據(刪除這個版本以前的全部版本)
delete't1','r1','c1',ts
複製代碼
HBase 刪除記錄並非真的刪除了數據,而是放置了一個墓碑標記(tombstone marker),把這個版本連同以前的版本都標記爲不可見了。這是爲了性能着想,這樣 HBase 就能夠按期去清理這些已經被刪除的記錄,而不用每次都進行刪除操做。
「按期」 的時間點是在 HBase 作自動合併(compaction,HBase整理存儲文件時的一個操做,會把多個文件塊合併成一個文件)的時候,這樣刪除操做對於 HBase 的性能影響被降到了最低,就算在很高的併發負載下大量刪除記錄也不怕了!
在記錄被真正刪除以前仍是能夠查詢到的,只須要在 scan 命令後跟上
RAW=>true
參數和適當的 VERSIONS 參數就能夠看到被打上墓碑標記(tombstone marker)的記錄,跟上 RAW 就是查詢到表的全部未通過過濾的原始記錄。
若是一個行有不少列,用 delete 來刪除記錄會把人累死,能夠 deleteall 命令來刪除整行記錄。
# 只須要明確到 rowkey 便可
deleteall 'test','row3'
複製代碼
HBase 還有不少表相關的操做,這裏不一一列出,在 shell 控制檯能夠輸入 help
命令得到幫助信息;若是但願查看某個命令的幫助信息,能夠執行 help '指令'
。
hbase(main):026:0> help
HBase Shell, version 2.0.0-cdh6.0.1, rUnknown, Wed Sep 19 09:14:00 PDT 2018
Type 'help "COMMAND"', (e.g. 'help "get"' -- the quotes are necessary) for help on a specific command.
Commands are grouped. Type 'help "COMMAND_GROUP"', (e.g. 'help "general"') for help on a command group.
複製代碼
Any Code,Code Any!
掃碼關注『AnyCode』,編程路上,一塊兒前行。