一、RowKey
與 nosql 數據庫們一樣,RowKey 是用來檢索記錄的主鍵。訪問 HBASE table 中的行,只有三種方式:
1、通過單個 RowKey 訪問
2、通過 RowKey 的 range(正則)
3、全表掃描
RowKey 行鍵可以是任意字符串(最大長度是 64KB,實際應用中長度一般為10-100bytes),在 HBASE 內部,RowKey 保存為字節數組。
存儲時,數據按照 RowKey 的字典序(byte order)排序存儲。設計 RowKey 時,要充分利用排序存儲這個特性,將經常一起讀取的行存儲在一起。
二、Column Family
列族:HBASE 表中的每個列,都歸屬于某個列族。列族是表的 schema 的一部分(而列不是),必須在使用表之前定義。
列名都以列族作為前綴。例如 courses:history,courses:math 都屬于 courses 這個列族。
三、Cell
由{rowkey, column Family:columu, version} 唯一確定的單元。cell 中的數據是沒有類型的,全部是字節碼形式存貯。
關鍵字:無類型、字節碼
四、Time Stamp
1、HBASE 中通過rowkey和columns確定的一個存貯單元稱為cell。每個 cell都保存著同一份數據的多個版本。
2、版本通過時間戳來索引。時間戳的類型是 64 位整型。時間戳可以由 HBASE(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒的當前系統時間。
時間戳也可以由客戶顯式賦值。如果應用程序要避免數據版本沖突,就必須自己生成具有唯一性的時間戳。
3、每個cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
4、為了避免數據存在過多版本中造成管理 (包括存貯和索引)負擔,HBASE 提供了兩種數據版本回收方式。
一是保存數據的最后n個版本,
二是保存最近一段時間內的版本(比如最近七天)。用戶可以針對每個列族進行設置。
五、 命名空間
命名空間的結構.png
1)、 Table:所有的表都是命名空間的成員,即表必屬于某個命名空間,如果沒有指定,則在 default 默認的命名空間中。
2) 、RegionServer group :一個命名空間包含了默認的 RegionServer Group。
3) 、Permission :權限,命名空間能夠讓我們來定義訪問控制列表 ACL( Access Control List )。
例如,創建表,讀取表,刪除,更新等等操作。
4) 、Quota :限額,可以強制一個命名空間可包含的 region 的數量。
(5)、查看命名空間:
hbase(main):083:0> list_namespace
NAMESPACE
default
hbase
2 row(s) in 0.0460 seconds
(6)、創建命名空間:
hbase(main):084:0> create_namespace 'bigdata'
0 row(s) in 0.8850 seconds
hbase(main):085:0> list_namespace
NAMESPACE
bigdata
default
hbase
3 row(s) in 0.0140 seconds
(7)、創建表在指定命名空間:
hbase(main):086:0> create 'bigdata:test', 'info'
0 row(s) in 1.2730 seconds
=> Hbase::Table - bigdata:test
(8)、刪除指定命名空間:注意刪除之前必須清空該命名空間,否則會報錯
hbase(main):087:0> drop_namespace 'bigdata'
ERROR: org.apache.hadoop.hbase.constraint.ConstraintException: Only empty namespaces can be removed. Namespace bigdata has 1 tables
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:106)
at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:95)
at org.apache.hadoop.hbase.util.ForeignExceptionUtil.toIOException(ForeignExceptionUtil.java:45)
at org.apache.hadoop.hbase.procedure2.RemoteProcedureException.fromProto(RemoteProcedureException.java:114)
at org.apache.hadoop.hbase.master.procedure.ProcedureSyncWait.waitForProcedureToComplete(ProcedureSyncWait.java:85)
at org.apache.hadoop.hbase.master.HMaster$15.run(HMaster.java:2941)
at org.apache.hadoop.hbase.master.procedure.MasterProcedureUtil.submitProcedure(MasterProcedureUtil.java:133)
at org.apache.hadoop.hbase.master.HMaster.deleteNamespace(HMaster.java:2929)
at org.apache.hadoop.hbase.master.MasterRpcServices.deleteNamespace(MasterRpcServices.java:508)
at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java:63460)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2369)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:124)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:297)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:277)
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hbase.constraint.ConstraintException): Only empty namespaces can be removed. Namespace bigdata has 1 tables
at org.apache.hadoop.hbase.master.procedure.DeleteNamespaceProcedure.prepareDelete(DeleteNamespaceProcedure.java:256)
at org.apache.hadoop.hbase.master.procedure.DeleteNamespaceProcedure.executeFromState(DeleteNamespaceProcedure.java:83)
at org.apache.hadoop.hbase.master.procedure.DeleteNamespaceProcedure.executeFromState(DeleteNamespaceProcedure.java:49)
at org.apache.hadoop.hbase.procedure2.StateMachineProcedure.execute(StateMachineProcedure.java:139)
at org.apache.hadoop.hbase.procedure2.Procedure.doExecute(Procedure.java:506)
at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.execProcedure(ProcedureExecutor.java:1167)
at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.execLoop(ProcedureExecutor.java:955)
at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.execLoop(ProcedureExecutor.java:908)
at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.access$400(ProcedureExecutor.java:77)
at org.apache.hadoop.hbase.procedure2.ProcedureExecutor$2.run(ProcedureExecutor.java:482)
Here is some help for this command:
Drop the named namespace. The namespace must be empty.
hbase(main):088:0>