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

rochy_he發表於2018-11-25

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

目錄

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

一、表操作(DDL)

1、啟動 HBase Shell

一般的資料庫都有命令列工具,HBase 也自帶了一個用 JRuby(JRuby 是用 Java 寫的 Ruby 直譯器)寫的 shell 命令列工具,執行以下命令來進入 HBase 的 shell:

# 一般叢集安裝好可以直接使用 hbase shell 啟動
$ HBASE_HOME/bin/hbase shell
複製程式碼

啟動 HBase Shell

2、新建表(create)

新建表需要注意的幾點:

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

HBase 表結構

可用通過下面的命令新建一個表:

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

3、檢視資料庫表(list)

用list命令可以看到整個庫中有哪些表:

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

4、檢視錶屬性(describe)

用 describe 命令檢視錶的元資訊:

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
複製程式碼

可以看到,預設是沒有設定壓縮和資料塊編碼。

5、刪除表(drop)

在刪除 HBase 表之前的時候,必須先執行停用(disable)命令,因為可能有很多客戶端現在正好連著,而且也有可能 HBase 正在做合併或者分裂操作。如果你這時刪除了表,會造成無法恢復的錯誤,HBase 也不會讓你直接就刪除表,而是需要先做一個 disable 操作,意思是把這個錶停用掉,並且下線。

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 來下線這個表,並且有很多涉及該表的操作需要被停用掉,以保證該表真的已經完全不參與任何工作了。

6、修改表(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'
複製程式碼

二、資料操作(DML)

1、插入(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 雖然說是時間的標定,其實你可以輸入任意的數字,比如 1、2、3 都可以儲存進去。
  • 列族和列的標識:HBase 並沒有專門的一個列族的欄來顯示列族這個屬性,它總是把列族和列用 “列族:列” 的組合方式來一起顯示,無論是 put 儲存還是 scan 的查詢使用的列定義,都是 列族:列” 的格式。

2、獲取單條資料(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
複製程式碼

3、查詢多條資料(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
複製程式碼

4、刪除單元格資料(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 就是查詢到表的所有未經過過濾的原始記錄。

5、刪除整行資料(deleteall)

如果一個行有很多列,用 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』,程式設計路上,一起前行。

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

相關文章