HBase是一種構建在HDFS之上的分布式、面向列的存儲系統。在需要實時讀寫、隨機訪問超大規模數據集時,可以使用HBase。
HBase的特點
- 大:一個表可以有上億行,上百萬列。
- 面向列:面向列表(簇)的存儲和權限控制,列(簇)獨立檢索。
- 稀疏:對于為空(NULL)的列,并不占用存儲空間,因此,表可以設計的非常稀疏。
- 無模式:每一行都有一個可以排序的主鍵和任意多的列,列可以根據需要動態增加,同一張表中不同的行可以有截然不同的列。
- 數據多版本:每個單元中的數據可以有多個版本,默認情況下,版本號自動分配,版本號就是單元格插入時的時間戳。
- 數據類型單一:HBase中的數據都是字符串,沒有類型。
2.1. 掌握HBase shell命令使用(創建一個學生信息表:rowkey要求是學號,一個列簇,包含姓名、性別、年齡、住址)
1.常用命令
1.1.hbase shell
進入hbase shell界面。
1.2.list
查看已經存在的表。
1.3.status
查詢服務器狀態。
1.4.version
查詢hbase版本。
表操作
2.1.創建表
在shell環境中使用disable命令可以把表設為離線,使用alter命令可以進行必要的修改,而enable命令則可以把表設置為在線。
建表過程由于不熟悉hbase shell建表格式,出現了很多錯誤,后面在一篇博客上看到了解釋后才恍然大悟。
例1:創建一個簡單表,只包含一個‘data’列’。表和列族屬性默認:
#create ‘test’ ,‘data’
例2:創建一個學生信息表:rowkey要求是學號,一個列簇,包含姓名、性別、年齡、住址:
例3:創建多個列簇:,包含姓名、性別、年齡、住址。表和列族屬性默認:
#create 'student',{NAME=>'name'},{NAME=>'sex'},{NAME=>'age'},{NAME=>'adress'}
2.2.刪除表
刪除表需要先將表置為離線,然后再刪除。
例:刪除test表
#disable ‘test’
#drop ‘test’
2.3.查看表結構
# 語法:describe <table>
例:查看student表的結構
#describe ‘student’
2.4.修改表結構
注意:修改表結構必須先將標置為離線
# 語法:alter 't1', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}
例:將name的版本設為2
#disable ‘student’
#alter ‘student’,{NAME=>’name’,VERSIONS=’2’}
#enable ‘student’
由于以下需要,所以又把name的版本改了回去。
3.權限管理
3.1.分配權限
# 語法 : grant <user> <permissions> <table> <column family> <column qualifier> 參數后面用逗號分隔
# 權限用五個字母表示: "RWXCA". READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')
例:給用戶‘root’分配對表‘student’有讀寫的權限:
#grant ‘root’,’RW’,’student’
3.2.查看權限
3.3.收回權限
4.增刪改查
4.1.插入記錄
# 語法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>
#例:插入數據到student1表中,rowkey要求是學號,包含姓名、性別、年齡、住址
這里我插入了四個數據。
4.2.查詢記錄
① 查詢某行記錄
# 語法:get <table>,<rowkey>,[<family:column>,....]
例1:查詢表student1中學號為201601的記錄
# get 'student1','201601'
例2:查詢表student1中學號為201601中的f1下的name
# get 'student1','201601',‘f1:name’
②掃描表
# 語法:scan <table>, {COLUMNS => [ <family:column>,.... ], LIMIT => num}
#LIMIT控制數據個數
例:掃描表student1前3條數據
#scan ‘student’,{LIMIT=>3}
③查詢表中的數據行數
# 語法:count <table>, {INTERVAL => intervalNum, CACHE => cacheNum}
# INTERVAL設置多少行顯示一次及對應的rowkey,默認1000;CACHE每次去取的緩存區大小,默認是10,調整該參數可提高查詢速度
例:查詢表student1中的行數,每100條顯示一次,緩存區為500
#count ‘student1’,{INTERVAL=>100,CACHE=>500}
4.3.修改記錄
修改記錄其實就是插入覆蓋。
# 語法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>
例:修改表student中學號為201601的名字
#put 'student1','201601','f1:name','jok'
5.掌握HBase的預分區功能,能夠采用預分區設計表
5.1.什么是預分區
HBase表在剛剛被創建時,只有1個分區(region),當一個region過大(達到hbase.hregion.max.filesize屬性中定義的閾值,默認10GB)時,表將會進行split,分裂為2個分區。表在進行split的時候,會耗費大量的資源,頻繁的分區對HBase的性能有巨大的影響,所以HBase提供了預分區功能,即用戶可以在創建表的時候對表按照一定的規則分區。
5.2.預分區設計
①通過手動分區方法
# 語法:create <table>, {NAME => <family>},SPLITS => [,,,,]
示例:
#create 't1', 'f1', SPLITS => ['10', '20', '30', '40']
#create 't1', {NAME =>'f1', TTL => 180}, SPLITS => ['10', '20', '30', '40']
#create 't1', {NAME =>'f1', TTL => 180}, {NAME => 'f2', TTL => 240}, SPLITS => ['10', '20', '30', '40']
注意:SPLITS里面的值代表分區位置,上面的10,20,30,40表示分區位置在這里,所以總共有五個分區。
例:手動分區創建一個有五個分區的表t1
#create 't1', 'f1', SPLITS => ['10', '20', '30', '40']
Web界面查看表結構,http://master:60010(hbase端口號60010)
②通過文件分區方法
# 語法:create <table>, {NAME => <family>},SPLITS => filepath
示例:
#create 't1', 'f1', SPLITS_FILE => '/tmp/splits.txt'
#create 't1', {NAME =>'f1', TTL => 180}, SPLITS_FILE => '/tmp/splits.txt'
#create 't1', {NAME =>'f1', TTL => 180}, {NAME => 'f2', TTL => 240}, SPLITS_FILE => '/tmp/splits.txt'
例:通過文件splits.txt內容建立分區t2
# create 't2', 'f1', SPLITS_FILE => '/tmp/splits.txt'
文件內容:
建立分區表:
Web界面查看分區: