怎么讓網(wǎng)站欄目頁收錄廣州公司關(guān)鍵詞網(wǎng)絡(luò)推廣
1 簡介
HBase的名字的來源于Hadoop database,即hadoop數(shù)據(jù)庫,不同于一般的關(guān)系數(shù)據(jù)庫,它是非結(jié)構(gòu)化數(shù)據(jù)存儲的數(shù)據(jù)庫,而且它是基于列的而不是基于行的模式。
HBase是一個分布式的、面向列的、基于Google Bigtable的開源實現(xiàn)。
利用Hadoop HDFS作為其文件存儲系統(tǒng),
利用Hadoop MapReduce來處理HBase中的海量數(shù)據(jù),
利用Zookeeper作為協(xié)同服務(wù)。
2 HBase重要概念
HBase以表的形式存儲數(shù)據(jù)。表是由行和列組成。列劃分為若干個列族/列簇(column family),每個列族/列簇下面可以有多個普通列。
2.1 表Table
HBase是用表來存儲數(shù)據(jù)的。
2.2 命名空間namespace
namespace命名空間指對一組表的邏輯分組,類似RDBMS中的database,方便對表在業(yè)務(wù)上劃分。
HBASE系統(tǒng)默認定義了兩個缺省的namespace:
- hbase:系統(tǒng)內(nèi)建表,包含namespace和meta表
- default:用戶建表時未指定namespace的表都創(chuàng)建在此
2.3 Row key
行鍵,每一行的主鍵列,每行的行鍵要唯一,行鍵的值為任意字符串(最大長度是 64KB,實際應(yīng)用中長度一般為 10-100bytes),在HBase內(nèi)部,rowKey保存為字節(jié)數(shù)組byte[]。
行的一次讀寫是原子操作 (不論一次讀寫多少列)
2.4 區(qū)域Region
Table在行的方向上分割為多個Region。
Region是按大小分割的,每個表開始只有一個region,隨著數(shù)據(jù)的增多,region不斷增大,當增大到一個閥值的時候,region就會等分為兩個新的region,之后會有越來越多的region。
Region是HBase中分布式存儲和負載均衡的最小單元。不同的Region分布到不同的RegionServer上。
Region由一個或者多個Store組成, 每個Store保存一個column family, 每個Store又由一個MemStore(存儲在內(nèi)存中)和0到多個StoreFile(存儲在HDFS上)組成。
2.5 列族 column family
列族是每個子列的父級,每個子列都屬于一個列族,一個列族包含一個或者多個相關(guān)列,創(chuàng)建表的時候需要指定列族,而列不需要必須指定。通過“列族名:列名”來表示某個具體的子列。
HBase中的Schema就是 TableName + Column Family Name
2.6 限定符
就是列族下的每個子列名稱,或者稱為相關(guān)列,或者稱為限定符,只是翻譯不同。
通過columnFamily:column來定位某個子列。
2.7 存儲單元cell
我們外觀看到的每個單元格其實都對應(yīng)著多個存儲單元,默認情況下一個單元格對應(yīng)著一個存儲單元,一個存儲單元可以存儲一份數(shù)據(jù),如果一個單元格有多個存儲單元就表示一個單元格可以存儲多個值??梢酝ㄟ^version來設(shè)置存儲單元個數(shù)??梢酝ㄟ^
rowKey + columnFamily + column + timestamp來唯一確定一個存儲單元。cell中的數(shù)據(jù)是沒有類型的,全部是字節(jié)碼形式存貯。
hbase按照時間戳降序排列各時間版本,其他映射建按照升序排序。
2.8 時間戳版本號 timestamp
每個cell都保存著同一份數(shù)據(jù)的多個版本。版本通過時間戳來索引。時間戳的類型是 64位整型。時間戳可以由hbase(在數(shù)據(jù)寫入時自動 )賦值,此時時間戳是精確到毫秒的當前系統(tǒng)時間。時間戳也可以由客戶顯式賦值。如果應(yīng)用程序要避免數(shù)據(jù)版本沖突,就必須自己生成具有唯一性的時間戳。每個cell中,不同版本的數(shù)據(jù)按照時間倒序排序,即最新的數(shù)據(jù)排在最前面。
為了避免數(shù)據(jù)存在過多版本造成的的管理 (包括存貯和索引)負擔(dān),hbase提供了兩種數(shù)據(jù)版本回收方式。一是保存數(shù)據(jù)的最后n個版本,二是保存最近一段時間內(nèi)的版本(比如最近七天)。用戶可以針對每個列族進行設(shè)置。
3 HBase Shell
命名 | 描述 | 語法 |
---|---|---|
help ‘命令名’ | 查看命令的使用描述 | help ‘命令名’ |
whoami | 我是誰 | whoami |
version | 返回hbase集群的狀態(tài)信息 | version |
status | 返回hbase集群的狀態(tài)信息 | status |
table_help | 查看如何操作表 | status |
create | 創(chuàng)建表 | create ‘表名’, ‘列族名1’, ‘列族名2’, ‘列族名N’ |
alter | 修改列族 | 添加一個列族:alter ‘表名’, ‘列族名’ / 刪除列族:alter ‘表名’, {NAME=> ‘列族名’, METHOD=> ‘delete’} |
describe | 顯示表相關(guān)的詳細信息 | describe ‘表名’ |
list | 列出hbase中存在的所有表 | list |
exists | 測試表是否存在 | exists ‘表名’ |
put | 添加或修改的表的值 | put ‘表名’, ‘行鍵’, ‘列族名’, ‘列值’ / put ‘表名’, ‘行鍵’, ‘列族名:列名’, ‘列值’ |
scan | 通過對表的掃描來獲取對用的值 | scan ‘表名’ / 掃描某個列族: scan ‘表名’, {COLUMN=>‘列族名’} / 掃描某個列族的某個列: scan ‘表名’, {COLUMN=>‘列族名:列名’} / 查詢同一個列族的多個列: scan ‘表名’, {COLUMNS => [ ‘列族名1:列名1’, ‘列族名1:列名2’, …]} |
get | 獲取行或單元(cell)的值 | get ‘表名’, ‘行鍵’ / get ‘表名’, ‘行鍵’, ‘列族名’ |
count | 統(tǒng)計表中行的數(shù)量 | count ‘表名’ |
incr | 增加指定表行或列的值 | incr ‘表名’, ‘行鍵’, ‘列族:列名’, 步長值 |
get_counter | 獲取計數(shù)器 | get_counter ‘表名’, ‘行鍵’, ‘列族:列名’ |
delete | 刪除指定對象的值(可以為表,行,列對應(yīng)的值,另外也可以指定時間戳的值)) | 刪除列族的某個列: delete ‘表名’, ‘行鍵’, ‘列族名:列名’ |
deleteall | 刪除指定行的所有元素值 | deleteall ‘表名’, ‘行鍵’ |
truncate | 重新創(chuàng)建指定表 | truncate ‘表名’ |
enable | 使表有效 | enable ‘表名’ |
is_enabled | 是否啟用 | is_enabled ‘表名’ |
disable | 使表無效 | disable ‘表名’ |
is_enabled | 是否啟用 | is_enabled ‘表名’ |
is_disabled | 是否無效 | is_disabled ‘表名’ |
drop | 刪除表 | drop的表必須是disable的 / disable ‘表名’ / drop ‘表名’ |
shutdown | 關(guān)閉hbase集群(與exit不同) | |
tools | 列出hbase所支持的工具 | |
exit | 退出 |
3.1 進入hbase命令行
cd /home/tuzq/software/hbase-1.3.1/bin
./hbase shell
3.2 help查看幫助
3.3 status返回hbase集群的狀態(tài)信息
顯示集群狀態(tài)status,可以為 ‘summary’, ‘simple’, ‘detailed’, or ‘replication’. 默認為 ‘summary’
hbase(main):006:0> status
1 active master, 0 backup masters, 2 servers, 0 dead, 31.0000 average load
hbase(main):011:0> status 'simaple'
1 active master, 0 backup masters, 2 servers, 0 dead, 31.0000 average load
Took 0.0478 seconds
hbase(main):012:0> status 'summary'
1 active master, 0 backup masters, 2 servers, 0 dead, 31.0000 average load
Took 0.0396 seconds
hbase(main):013:0> status 'replication'
version 2.0.2.3.1.4.0-315
2 live servershadoop4:SOURCE:SINK : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:44 CST 2020hadoop5:SOURCE:SINK : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:43 CST 2020
Took 0.0349 seconds
=> #<Java::JavaUtil::Collections::UnmodifiableSet:0x1109730f>
hbase(main):014:0> status 'replication', 'source'
version 2.0.2.3.1.4.0-315
2 live servershadoop4:SOURCE:hadoop5:SOURCE:
Took 0.0575 seconds
=> #<Java::JavaUtil::Collections::UnmodifiableSet:0x3ce7394f>
hbase(main):015:0> status 'replication','sink'
version 2.0.2.3.1.4.0-315
2 live servershadoop4:SINK : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:44 CST 2020hadoop5:SINK : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:43 CST 2020
Took 0.0504 seconds
=> #<Java::JavaUtil::Collections::UnmodifiableSet:0x68a426c3>
hbase(main):016:0>
3.4 list顯示hbase中的表
list(列出你有哪些表)
3.5 disable,drop刪除user
disable ‘user’
drop ‘user’
3.6 flush清空數(shù)據(jù)
flush ‘user’
3.7 create創(chuàng)建user表,包含info、data兩個列族
create 'user', 'info', 'data'
create 'user', {NAME => 'info', VERSIONS => '3'}
3.8 describe顯示表相關(guān)的詳情信息
hbase(main):003:0> describe 'user'
Table user is ENABLED
user
COLUMN FAMILIES DESCRIPTION
{NAME => 'data', 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 => 'R
OW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSI
ON => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
{NAME => 'info', 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 => 'R
OW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSI
ON => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
2 row(s)
Took 0.2026 seconds
hbase(main):004:0>
3.9 put向hbase表中插入信息
向user表中插入信息,row key為rk0001,列族info中添加name列標示符,值為zhangsan
put 'user', 'rk0001', 'info:name', 'zhangsan'
向user表中插入信息,row key為rk0001,列族info中添加gender列標示符,值為female
put 'user', 'rk0001', 'info:gender', 'male'
向user表中插入信息,row key為rk0001,列族info中添加age列標示符,值為20
put 'user', 'rk0001', 'info:age', 20
put 'user', 'rk0001', 'info:baby', 'anaglababy'
向user表中插入信息,row key為rk0001,列族data中添加pic列標示符,值為picture
put 'user', 'rk0002', 'data:pic', 'picture'
3.10 get 獲取user表中row key為rk0001的所有信息
get 'namespaceName:tableName','rowKey','列族:列'get 'user', 'rk0001' (一次拿一行)
獲取user表中row key為rk0001,info列族的所有信息
get 'user', 'rk0001', 'info'
獲取user表中row key為rk0001,info列族的name、age列標示符的信息
get 'user', 'rk0001', 'info:name', 'info:age'
獲取user表中row key為rk0001,info、data列族的信息
get 'user', 'rk0001', 'info', 'data'
get 'user', 'rk0001', {COLUMN => ['info', 'data']}
get 'user', 'rk0001', {COLUMN => ['info:name', 'data:pic']}
獲取user表中row key為rk0001,列族為info,版本號最新5個的信息
get 'user', 'rk0001', {COLUMN => 'info', VERSIONS => 2}
get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5}
get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5, TIMERANGE => [1488892553804, 1488892688096]}
獲取user表中row key為rk0001,cell的值為zhangsan的信息
get 'people', 'rk0001', {FILTER => "ValueFilter(=, 'binary:圖片')"}
獲取user表中row key為rk0001,列標示符中含有a的信息
get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}
put 'user', 'rk0002', 'info:name', 'fanbingbing'
put 'user', 'rk0002', 'info:gender', 'female'
put 'user', 'rk0002', 'info:nationality', '中國'
get 'user', 'rk0002', {FILTER => "ValueFilter(=, 'binary:中國')"}
3.11 scan 查詢user表中的所有信息
帶有條數(shù)的scan
scan 'user', {LIMIT=>5}
scan 'namespaceName:tableName',{TIMERANGE => [1594201571000, 1594287971000]}
scan 'user'
查詢user表中列族為info的信息
scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}
查詢user表中列族為info和data的信息
scan 'user', {COLUMNS => ['info', 'data']}
scan 'user', {COLUMNS => ['info:name', 'data:pic']}
查詢user表中列族為info、列標示符為name的信息
scan 'user', {COLUMNS => 'info:name'}
查詢user表中列族為info、列標示符為name的信息,并且版本最新的5個
scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}
查詢user表中列族為info和data且列標示符中含有a字符的信息
scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}
查詢user表中列族為info,rk范圍是[rk0001, rk0003)的數(shù)據(jù)
scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}
查詢user表中row key以rk字符開頭的
scan 'user',{FILTER=>"PrefixFilter('rk')"}
查詢user表中指定范圍的數(shù)據(jù)
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
3.12 delete刪除數(shù)據(jù)
刪除user表row key為rk0001,列標示符為info:name的數(shù)據(jù)
delete 'user', 'rk0001', 'info:name'
刪除user表row key為rk0001,列標示符為info:name,timestamp為1392383705316的數(shù)據(jù)
delete 'user', 'rk0001', 'info:name', 1392383705316
3.13 truncate 清空user表中的數(shù)據(jù)
truncate 'user'
3.14 alter 修改表結(jié)構(gòu)
3.14.1 disable 首先停用user表
disable 'user'
停用之后的表示無法操作的
添加兩個列族f1和f2
alter 'people', NAME => 'f1'
alter 'user', NAME => 'f2'
3.15 enable 啟用表
enable 'user'
測試:
hbase(main):009:0> put 'user','rk0001','f1:name','zhangsan'
0 row(s) in 0.0460 secondshbase(main):010:0> scan 'user'
ROW COLUMN+CELL rk0001 column=data:pic, timestamp=1529293065769, value=picture rk0001 column=f1:name, timestamp=1529297704531, value=zhangsan rk0001 column=info:age, timestamp=1529292703053, value=20 rk0001 column=info:gender, timestamp=1529292652194, value=male rk0002 column=data:pic, timestamp=1529292913569, value=picture rk0002 column=info:gender, timestamp=1529295488032, value=female rk0002 column=info:name, timestamp=1529295421434, value=fanbingbing rk0002 column=info:nationality, timestamp=1529295956024, value=\xE4\xB8\xAD\xE5\x9B\xBD
2 row(s) in 0.0120 seconds
其中disable ‘user’
刪除一個列族:
alter 'user', NAME => 'f1', METHOD => 'delete' 或 alter 'user', 'delete' => 'f1'
案例:
hbase(main):001:0> alter 'user',NAME => 'f1',METHOD => 'delete'
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 3.0000 secondshbase(main):003:0> scan 'user'
ROW COLUMN+CELL rk0001 column=data:pic, timestamp=1529293065769, value=picture rk0001 column=info:age, timestamp=1529292703053, value=20 rk0001 column=info:gender, timestamp=1529292652194, value=male rk0002 column=data:pic, timestamp=1529292913569, value=picture rk0002 column=info:gender, timestamp=1529295488032, value=female rk0002 column=info:name, timestamp=1529295421434, value=fanbingbing rk0002 column=info:nationality, timestamp=1529295956024, value=\xE4\xB8\xAD\xE5\x9B\xBD
2 row(s) in 0.0510 secondshbase(main):004:0>
添加列族f1同時刪除列族f2
alter 'user', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}
將user表的f1列族版本號改為5
alter 'people', NAME => 'info', VERSIONS => 5
啟用表
enable 'user'
刪除表
disable 'user'
drop 'user'get 'person', 'rk0001', {FILTER => "ValueFilter(=, 'binary:中國')"}
get 'person', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}
scan 'person', {COLUMNS => 'info:name'}
scan 'person', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}
scan 'person', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}scan 'person', {COLUMNS => 'info', STARTROW => '20140201', ENDROW => '20140301'}
scan 'person', {COLUMNS => 'info:name', TIMERANGE => [1395978233636, 1395987769587]}
delete 'person', 'rk0001', 'info:name'alter 'person', NAME => 'ffff'
alter 'person', NAME => 'info', VERSIONS => 10get 'user', 'rk0002', {COLUMN => ['info:name', 'data:pic']}
exists測試表是否存在
exit 退出Hbaseshell
3.16 統(tǒng)計表的條數(shù)
方式一:
hbase(main):005:0> count 'test1:fathers_info' (不建議)
方式二:
[root@hadoop6 ~]# hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'namespaceName:tableName'
常用操作之namespace
1 介紹
在HBase中,namespace命名空間指對一組表的邏輯分組,類似RDBMS中的database,方便對表在業(yè)務(wù)上進行劃分。HBase全局管理員可以創(chuàng)建、修改和回收namespace的授權(quán)。
namespace特性是對表資源進行隔離的一種技術(shù),隔離技術(shù)決定了HBase能否實現(xiàn)資源統(tǒng)一化管理的關(guān)鍵,提高了整體的安全性。
## 2 命名空間namespace
HBase系統(tǒng)默認定義了兩個缺省的namespace
hbase:系統(tǒng)內(nèi)建表,包括namespace和meta表都在此
default:用戶建表時未指定namespace的表都創(chuàng)建在此
-- 創(chuàng)建namespace
hbase>create_namespace 'nml_ljx'
-- 列出所有namespace
hbase>list_namespace
-- 查看namespace
hbase>describe_namespace 'nml_ljx'
-- 刪除namespace
hbase>drop_namespace 'nml_ljx'
-- 在namespace下創(chuàng)建表
hbase>create 'nml_ljx:testtable', 'cf1'
-- 查看namespace下的表
hbase>list_namespace_tables 'nml_ljx'
3 授權(quán)
- Create權(quán)限的namespace Admin可以對表創(chuàng)建和刪除、生成和恢復(fù)快照
- Admin權(quán)限的namespace Admin可以對表splits或major compactions
-- 當前用戶:hbase
hbase>namespace_create 'hbase_ns'
-- 授權(quán)用戶apple對hbase_ns寫權(quán)限
hbase>grant 'apple', 'W', '@hbase_ns'
-- 回收用戶apple對hbase_ns所有權(quán)限
hbase>revoke 'apple', '@hbase_ns'-- 當前用戶:apple
hbase>create 'hbase_ns.table1', 'cfamily1'
hbase>create 'hbase_ns.table2', 'cfamily1'-- 用戶apple創(chuàng)建了兩張表table1和table2,對兩張表有'RWXCA'權(quán)限
-- 若用戶lemon也需獲得hbase_ns下的權(quán)限,hbase管理員操作如下
-- 當前用戶:hbase
hbase>grant 'lemon', 'W', '@hbase_ns'-- 此時lemon可以在hbase_ns下創(chuàng)建表,但無法讀、修改、刪除hbase_ns下已存在的表
-- 當前用戶:lemon
hbase>scan 'hbase_ns:table1'
-- AccessDeniedException 報錯無權(quán)限-- hbase管理員進行如下授權(quán)操作,lemon則可訪問已經(jīng)存在的表
-- 當前用戶:hbase
hbase>grant 'alice', 'RW', 'hbase_ns.table1'
hbase>grant 'alice', 'RW', 'hbase_ns.table2'
配置hbase-site.xml啟用授權(quán)機制,配置完成后需要重啟HBase集群
<property><name>hbase.security.authorization</name><value>true</value>
</property>
<property><name>hbase.coprocessor.master.classes</name><value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property><name>hbase.coprocessor.region.classes</name><value>org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.AccessController</value>
</property>