HBase-Shell-數據結構-原理

3 HBase Shell操做

3.1 基本操做

1.進入HBase客戶端命令行sql

[lxl@hadoop102 hbase]$ bin/hbase shell

 

2.查看幫助命令shell

hbase(main):001:0> help

 

3.查看當前數據庫中有哪些表數據庫

hbase(main):001:0> list
TABLE                                                                                                                                                                                                            
0 row(s) in 0.2530 seconds

=> []

 

3.2 表的操做

1.建立表數組

hbase(main):003:0> create 'student','info'
0 row(s) in 1.3670 seconds

=> Hbase::Table - student

 

2.插入數據到表數據結構

hbase(main):003:0> put 'student','1001','info:sex','male'
hbase(main):004:0> put 'student','1001','info:age','18'
hbase(main):005:0> put 'student','1002','info:name','Janna'
hbase(main):006:0> put 'student','1002','info:sex','female'
hbase(main):007:0> put 'student','1002','info:age','20'

 

3.掃描查看錶數據nosql

hbase(main):010:0>  scan 'student'
ROW                                                   COLUMN+CELL                                                                                                                                                
 1001                                                 column=info:name, timestamp=1560293882038, value=xiannv                                                                                                    
 1001                                                 column=info:sex, timestamp=1560293938473, value=female                                                                                                     
 1002                                                 column=info:name, timestamp=1560293958558, value=xiantong                                                                                                  
 1002                                                 column=info:sex, timestamp=1560293983958, value=male 

 

hbase(main):014:0> scan 'student',{STARTROW=>'1001',STOPROW=>'1003'}
ROW                                                   COLUMN+CELL                                                                                                                                                
 1001                                                 column=info:name, timestamp=1560293882038, value=xiannv                                                                                                    
 1001                                                 column=info:sex, timestamp=1560293938473, value=female                                                                                                     
 1002                                                 column=info:name, timestamp=1560293958558, value=xiantong                                                                                                  
 1002                                                 column=info:sex, timestamp=1560293983958, value=male  

 

hbase(main):015:0> scan 'student',{STARTROW => '1001'}
ROW                                                   COLUMN+CELL                                                                                                                                                
 1001                                                 column=info:name, timestamp=1560293882038, value=xiannv                                                                                                    
 1001                                                 column=info:sex, timestamp=1560293938473, value=female                                                                                                     
 1002                                                 column=info:name, timestamp=1560293958558, value=xiantong                                                                                                  
 1002                                                 column=info:sex, timestamp=1560293983958, value=male                                                                                                       
 1003                                                 column=info:sex, timestamp=1560294341536, value=male  

 

4.查看錶結構jsp

hbase(main):016:0> describe 'student'
Table student is ENABLED                                                                                                                                                                                         
student                                                                                                                                                                                                          
COLUMN FAMILIES DESCRIPTION                                                                                                                                                                                      
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCA
CHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}

 

5.更新指定字段的數據oop

hbase(main):012:0> put 'student','1001','info:name','Nick'
hbase(main):013:0> put 'student','1001','info:age','100'

 

6.查看「指定行」或「指定列族:列」的數據spa

hbase(main):011:0> get 'student','1001'
COLUMN                                                CELL                                                                                                                                                       
 info:name                                            timestamp=1560293882038, value=xiannv                                                                                                                      
 info:sex                                             timestamp=1560293938473, value=female

 

hbase(main):012:0> get 'student','1001','info:name'
COLUMN                                                CELL                                                                                                                                                       
 info:name                                            timestamp=1560293882038, value=xiannv 

 

7.統計表數據行數命令行

hbase(main):021:0> count 'student'

 

8.刪除數據

刪除某rowkey的所有數據:

hbase(main):016:0> deleteall 'student','1001'

 

刪除某rowkey的某一列數據:

hbase(main):017:0> delete 'student','1002','info:sex'

 

9.清空表數據

hbase(main):018:0> truncate 'student'

 

提示:清空表的操做順序爲先disable,而後再truncate

10.刪除表

首先須要先讓該表爲disable狀態:

hbase(main):019:0> disable 'student'

 

而後才能drop這個表:

hbase(main):020:0> drop 'student'

 

提示:若是直接drop表,會報錯:ERROR: Table student is enabled. Disable it first.

11.變動表信息

info列族中的數據存放3個版本:

hbase(main):022:0> alter 'student',{NAME=>'info',VERSIONS=>3}
hbase(main):022:0> get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}

 

操做:

hbase(main):018:0> alter 'student', {NAME=>'info',VERSIONS=>3}
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9710 seconds

hbase(main):019:0> describe 'student'
Table student is ENABLED                                                                                                                                                                                         
student                                                                                                                                                                                                          
COLUMN FAMILIES DESCRIPTION                                                                                                                                                                                      
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '3', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCA
CHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}                                                                                                                                                   
1 row(s) in 0.0150 seconds

hbase(main):020:0> put 'student','1001','info:name','guangshen'
0 row(s) in 0.0080 seconds

hbase(main):021:0> get 'student','1001','info:name'
COLUMN                                                CELL                                                                                                                                                       
 info:name                                            timestamp=1560295375184, value=guangshen                                                                                                                   
1 row(s) in 0.0170 seconds

hbase(main):022:0> get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}
COLUMN                                                CELL                                                                                                                                                       
 info:name                                            timestamp=1560295375184, value=guangshen                                                                                                                   
 info:name                                            timestamp=1560293882038, value=xiannv                                                                                                                      
1 row(s) in 0.0480 seconds

hbase(main):023:0> put 'student','1001','info:name','chunlei'
0 row(s) in 0.0080 seconds

hbase(main):024:0> get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}
COLUMN                                                CELL                                                                                                                                                       
 info:name                                            timestamp=1560295467589, value=chunlei                                                                                                                     
 info:name                                            timestamp=1560295375184, value=guangshen                                                                                                                   
 info:name                                            timestamp=1560293882038, value=xiannv                                                                                                                      
1 row(s) in 0.0090 seconds

hbase(main):025:0> put 'student','1001','info:name','wangjun'
0 row(s) in 0.0080 seconds

hbase(main):026:0> get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}
COLUMN                                                CELL                                                                                                                                                       
 info:name                                            timestamp=1560295506023, value=wangjun                                                                                                                     
 info:name                                            timestamp=1560295467589, value=chunlei                                                                                                                     
 info:name                                            timestamp=1560295375184, value=guangshen                                                                                                                   
1 row(s) in 0.0080 seconds

 

4 HBase數據結構

4.1 RowKey

  與nosql數據庫們同樣,RowKey是用來檢索記錄的主鍵。訪問HBASE table中的行,只有三種方式:

  1.經過單個RowKey訪問

  2.經過RowKeyrange(正則)

  3.全表掃描

  RowKey行鍵 (RowKey)能夠是任意字符串(最大長度是64KB,實際應用中長度通常爲 10-100bytes),在HBASE內部,

RowKey保存爲字節數組。存儲時,數據按照RowKey的字典序(byte order)排序存儲。設計RowKey時,要充分排序存儲這個特性,將常常一塊兒讀取的行存儲放到一塊兒。(位置相關性)

4.2 Column Family

  列族:HBASE表中的每一個列,都歸屬於某個列族。列族是表的schema的一部 分(而列不是),必須在使用表以前定義。列名都以列族做爲前綴。例如 courses:historycourses:math都屬於courses 這個列族。

4.3 Cell

  由{rowkey, column Family:columu, version} 惟一肯定的單元。cell中的數據是沒有類型的,所有是字節碼形式存貯。

  關鍵字:無類型、字節碼

4.4 Time Stamp

  HBASE 中經過rowkeycolumns肯定的爲一個存貯單元稱爲cell。每一個 cell都保存 着同一份數據的多個版本。版本經過時間戳來索引。時間戳的類型是 64位整型。時間戳能夠由HBASE(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒 的當前系統時間。時間戳也能夠由客戶顯式賦值。若是應用程序要避免數據版 本衝突,就必須本身生成具備惟一性的時間戳。每一個 cell中,不一樣版本的數據按照時間倒序排序,即最新的數據排在最前面。

  爲了不數據存在過多版本形成的的管理 (包括存貯和索引)負擔,HBASE提供 了兩種數據版本回收方式。一是保存數據的最後n個版本,二是保存最近一段 時間內的版本(好比最近七天)。用戶能夠針對每一個列族進行設置。

4.5 命名空間

命名空間的結構:

 

 

1) Table:表,全部的表都是命名空間的成員,即表必屬於某個命名空間,若是沒有指定,則在default默認的命名空間中。

2) RegionServer group一個命名空間包含了默認的RegionServer Group

3) Permission權限,命名空間可以讓咱們來定義訪問控制列表ACLAccess Control List)。例如,建立表,讀取表,刪除,更新等等操做。

4) Quota限額,能夠強制一個命名空間可包含的region的數量。

 

查看命名空間:

hbase(main):003:0> list_namespace

 

建立命名空間:

hbase(main):004:0> create_namespace 'bigdata'

 

將表建立在自定義的命名空間中:

hbase(main):006:0> create 'bigdata:student','info'

 

查看自定義命名空間中的表: 

hbase(main):007:0> list
TABLE                                                                                                                                                                                                            
bigdata:student                                                                                                                                                                                                  
student                                                                                                                                                                                                          
2 row(s) in 0.0080 seconds


=> ["bigdata:student", "student"]

 

刪除命名空間:(首先你得先刪除命名空間中的表,不然會報錯!)

hbase(main):008:0> drop_namespace 'bigdata'

 

 

 

 

 

 

5 HBase原理

5.1 讀流程

HBase讀數據流程如圖3所示

 

                                  3所示 HBase讀數據流程

 

1Client先訪問zookeeper,從meta表讀取region的位置,而後讀取meta表中的數據。meta中又存儲了用戶表的region信息;

2)根據namespace、表名和rowkeymeta表中找到對應的region信息;

3)找到這個region對應的regionserver

4)查找對應的region

5)先從MemStore找數據,若是沒有,再到BlockCache裏面讀;

6BlockCache尚未,再到StoreFile上讀(爲了讀取的效率)

7)若是是從StoreFile裏面讀取的數據,不是直接返回給客戶端,而是先寫入BlockCache,再返回給客戶端。

 

在端口(http://hadoop102:16010/table.jsp?name=hbase:meta)中查看meta表所在的位置:

 

 

 

連接zookeeper,查看meta的存儲位置:

[lxl@hadoop102 zookeeper-3.4.10]$ bin/zkCli.sh 

 

[zk: localhost:2181(CONNECTED) 2] get /hbase/meta-region-server
?regionserver:16020??O?[PBUF
 
    hadoop102?}????- 
cZxid = 0x500000030
ctime = Wed Jun 12 05:10:12 CST 2019
mZxid = 0x500000030
mtime = Wed Jun 12 05:10:12 CST 2019
pZxid = 0x500000030
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 62
numChildren = 0

 

 

 

在hbase中查看meta存儲的信息:

hbase(main):009:0> scan 'hbase:meta'
ROW                                                   COLUMN+CELL                                                                                                                                                
 bigdata:student,,1560298961661.c1d09e4ba7ff05adb8388 column=info:regioninfo, timestamp=1560298962242, value={ENCODED => c1d09e4ba7ff05adb8388529a48d992c, NAME => 'bigdata:student,,1560298961661.c1d09e4ba7ff05
 529a48d992c.                                         adb8388529a48d992c.', STARTKEY => '', ENDKEY => ''}                                                                                                        
 bigdata:student,,1560298961661.c1d09e4ba7ff05adb8388 column=info:seqnumDuringOpen, timestamp=1560298962242, value=\x00\x00\x00\x00\x00\x00\x00\x02                                                              
 529a48d992c.                                                                                                                                                                                                    
 bigdata:student,,1560298961661.c1d09e4ba7ff05adb8388 column=info:server, timestamp=1560298962242, value=hadoop102:16020                                                                                         
 529a48d992c.                                                                                                                                                                                                    
 bigdata:student,,1560298961661.c1d09e4ba7ff05adb8388 column=info:serverstartcode, timestamp=1560298962242, value=1560287383451                                                                                  
 529a48d992c.                                                                                                                                                                                                    
 hbase:namespace,,1560287388965.d8793997d53ec389eefa4 column=info:regioninfo, timestamp=1560288011539, value={ENCODED => d8793997d53ec389eefa4efbce8b00df, NAME => 'hbase:namespace,,1560287388965.d8793997d53ec3
 efbce8b00df.                                         89eefa4efbce8b00df.', STARTKEY => '', ENDKEY => ''}                                                                                                        
 hbase:namespace,,1560287388965.d8793997d53ec389eefa4 column=info:seqnumDuringOpen, timestamp=1560288011539, value=\x00\x00\x00\x00\x00\x00\x00\x0B                                                              
 efbce8b00df.                                                                                                                                                                                                    
 hbase:namespace,,1560287388965.d8793997d53ec389eefa4 column=info:server, timestamp=1560288011539, value=hadoop104:16020                                                                                         
 efbce8b00df.                                                                                                                                                                                                    
 hbase:namespace,,1560287388965.d8793997d53ec389eefa4 column=info:serverstartcode, timestamp=1560288011539, value=1560287762200                                                                                  
 efbce8b00df.                                                                                                                                                                                                    
 student,,1560298560640.cff5643f1df6fb44a31c72894f6cd column=info:regioninfo, timestamp=1560298584595, value={ENCODED => cff5643f1df6fb44a31c72894f6cdeb9, NAME => 'student,,1560298560640.cff5643f1df6fb44a31c72
 eb9.                                                 894f6cdeb9.', STARTKEY => '', ENDKEY => ''}                                                                                                                
 student,,1560298560640.cff5643f1df6fb44a31c72894f6cd column=info:seqnumDuringOpen, timestamp=1560298584595, value=\x00\x00\x00\x00\x00\x00\x00\x02                                                              
 eb9.                                                                                                                                                                                                            
 student,,1560298560640.cff5643f1df6fb44a31c72894f6cd column=info:server, timestamp=1560298584595, value=hadoop103:16020                                                                                         
 eb9.                                                                                                                                                                                                            
 student,,1560298560640.cff5643f1df6fb44a31c72894f6cd column=info:serverstartcode, timestamp=1560298584595, value=1560287489969         

 

在端口中查看錶的存儲位置:

 

 

 

 

 

 

 

 

 

 讀數據微觀流程

 

 

5.2 寫流程

Hbase寫流程如圖2所示

 

                              2  HBase寫數據流程

 

1ClientHregionServer發送寫請求;

2HregionServer將數據寫到HLogwrite ahead log)。爲了數據的持久化和恢復;

3HregionServer將數據寫到內存(MemStore);

4)反饋Client寫成功。

5.3 數據Flush過程

1)當MemStore數據達到閾值(默認是128M,老版本是64M),將數據刷到硬盤,將內存中的數據刪除,同時刪除HLog中的歷史數據;

2)並將數據存儲到HDFS中;

3)在HLog中作標記點。

 

hbase-default.xml:(hbase默認配置文件)

 

 

5.4 數據合併過程

1)當數據塊達到4塊,Hmaster觸發合併操做,Region將數據塊加載到本地,進行合併;

2)當合並的數據超過256M,進行拆分,將拆分後的Region分配給不一樣的HregionServer管理;

3)當HregionServer宕機後,將HregionServer上的hlog拆分,而後分配給不一樣的HregionServer加載,修改.META.;

4)注意:HLog會同步到HDFS

 

hbase-default.xml:(hbase默認配置文件)

 

相關文章
相關標籤/搜索