《HBase 不睡覺》第三章 - HBase 基本操做

《HBase 不睡覺書》是一本讓人看了不會睡着的 HBase 技術書籍,寫的很是不錯,爲了加深記憶,決定把書中重要的部分整理成讀書筆記,便於後期查閱,同時但願爲初學 HBase 的同窗帶來一些幫助。shell

目錄

本文主要介紹 hbase shell 的使用。數據庫

1、表操做(DDL)

一、啓動 HBase Shell

通常的數據庫都有命令行工具,HBase 也自帶了一個用 JRuby(JRuby 是用 Java 寫的 Ruby 解釋器)寫的 shell 命令行工具,執行如下命令來進入 HBase 的 shell:編程

# 通常集羣安裝好能夠直接使用 hbase shell 啓動
$ HBASE_HOME/bin/hbase shell
複製代碼

啓動 HBase Shell

二、新建表(create)

新建表須要注意的幾點:bash

  • HBase 的表都是由列族(Column Family)組成的;
  • 沒有列族的表是沒有意義的;
  • 列並非依附於表上,而是依附於列族上。

HBase 表結構

可用經過下面的命令新建一個表:併發

# 新建一個表 'test',包含了一個列族 'cf'
# HBase 新建表時,至少須要一個列族
create 'test', 'cf'
複製代碼

三、查看數據庫表(list)

用list命令能夠看到整個庫中有哪些表:工具

hbase(main):010:0> list
TABLE                                                                           
test                                                                            
test1                                                                           
test3                                                                           
3 row(s)
Took 0.0048 seconds                                                             
=> ["test", "test1", "test3"]
複製代碼

四、查看錶屬性(describe)

用 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
複製代碼

能夠看到,默認是沒有設置壓縮和數據塊編碼。性能

五、刪除表(drop)

在刪除 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)

可使用 alter 命令對錶進行修改,修改時無需禁用表,可是強烈建議在生產環境下執行這個命令以前,最好先停用(disable)這個表。由於對列族的全部操做都會同步到 全部擁有這個表的 RegionServer 上,當有不少客戶端都在連着的時候,直接新增一個列族對性能的影響較大(還有可能出現意外的問題)。

# 修改多個屬性
alter 't1', 'f1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5}
# 新增列族
alter 't1', 'cf2'
# 刪除列族
alter 't1', NAME => 'f1', METHOD => 'delete'
複製代碼

2、數據操做(DML)

一、插入(put)

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)信息。

  • 時間戳:每個單元格均可以存儲多個版本(version)的值,HBase 的單元格並無 version 這個屬性,它用 timestamp 來存儲該條記錄的時間戳,這個時間戳就用來當版本號使用;這個 timestamp 雖說是時間的標定,其實你能夠輸入任意的數字,好比 一、二、3 均可以存儲進去。
  • 列族和列的標識:HBase 並無專門的一個列族的欄來顯示列族這個屬性,它老是把列族和列用 「列族:列」 的組合方式來一塊兒顯示,不管是 put 存儲仍是 scan 的查詢使用的列定義,都是 列族:列」 的格式。

二、獲取單條數據(get)

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)

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 命令:

# 刪除某一單元格數據
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 就是查詢到表的全部未通過過濾的原始記錄。

五、刪除整行數據(deleteall)

若是一個行有不少列,用 delete 來刪除記錄會把人累死,能夠 deleteall 命令來刪除整行記錄。

# 只須要明確到 rowkey 便可
deleteall 'test','row3'
複製代碼

3、獲取幫助

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』,編程路上,一塊兒前行。

相關文章
相關標籤/搜索