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 => []
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
與nosql數據庫們同樣,RowKey是用來檢索記錄的主鍵。訪問HBASE table中的行,只有三種方式:
1.經過單個RowKey訪問
2.經過RowKey的range(正則)
3.全表掃描
RowKey行鍵 (RowKey)能夠是任意字符串(最大長度是64KB,實際應用中長度通常爲 10-100bytes),在HBASE內部,
RowKey保存爲字節數組。存儲時,數據按照RowKey的字典序(byte order)排序存儲。設計RowKey時,要充分排序存儲這個特性,將常常一塊兒讀取的行存儲放到一塊兒。(位置相關性)
列族:HBASE表中的每一個列,都歸屬於某個列族。列族是表的schema的一部 分(而列不是),必須在使用表以前定義。列名都以列族做爲前綴。例如 courses:history,courses:math都屬於courses 這個列族。
由{rowkey, column Family:columu, version} 惟一肯定的單元。cell中的數據是沒有類型的,所有是字節碼形式存貯。
關鍵字:無類型、字節碼
HBASE 中經過rowkey和columns肯定的爲一個存貯單元稱爲cell。每一個 cell都保存 着同一份數據的多個版本。版本經過時間戳來索引。時間戳的類型是 64位整型。時間戳能夠由HBASE(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒 的當前系統時間。時間戳也能夠由客戶顯式賦值。若是應用程序要避免數據版 本衝突,就必須本身生成具備惟一性的時間戳。每一個 cell中,不一樣版本的數據按照時間倒序排序,即最新的數據排在最前面。
爲了不數據存在過多版本形成的的管理 (包括存貯和索引)負擔,HBASE提供 了兩種數據版本回收方式。一是保存數據的最後n個版本,二是保存最近一段 時間內的版本(好比最近七天)。用戶能夠針對每一個列族進行設置。
命名空間的結構:
1) Table:表,全部的表都是命名空間的成員,即表必屬於某個命名空間,若是沒有指定,則在default默認的命名空間中。
2) RegionServer group:一個命名空間包含了默認的RegionServer Group。
3) Permission:權限,命名空間可以讓咱們來定義訪問控制列表ACL(Access 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'
HBase讀數據流程如圖3所示
圖3所示 HBase讀數據流程
1)Client先訪問zookeeper,從meta表讀取region的位置,而後讀取meta表中的數據。meta中又存儲了用戶表的region信息;
2)根據namespace、表名和rowkey在meta表中找到對應的region信息;
3)找到這個region對應的regionserver;
4)查找對應的region;
5)先從MemStore找數據,若是沒有,再到BlockCache裏面讀;
6)BlockCache尚未,再到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
在端口中查看錶的存儲位置:
讀數據微觀流程
Hbase寫流程如圖2所示
圖2 HBase寫數據流程
1)Client向HregionServer發送寫請求;
2)HregionServer將數據寫到HLog(write ahead log)。爲了數據的持久化和恢復;
3)HregionServer將數據寫到內存(MemStore);
4)反饋Client寫成功。
1)當MemStore數據達到閾值(默認是128M,老版本是64M),將數據刷到硬盤,將內存中的數據刪除,同時刪除HLog中的歷史數據;
2)並將數據存儲到HDFS中;
3)在HLog中作標記點。
hbase-default.xml:(hbase默認配置文件)
1)當數據塊達到4塊,Hmaster觸發合併操做,Region將數據塊加載到本地,進行合併;
2)當合並的數據超過256M,進行拆分,將拆分後的Region分配給不一樣的HregionServer管理;
3)當HregionServer宕機後,將HregionServer上的hlog拆分,而後分配給不一樣的HregionServer加載,修改.META.;
4)注意:HLog會同步到HDFS。
hbase-default.xml:(hbase默認配置文件)