HBase之namespace

Posted 健哥说编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase之namespace相关的知识,希望对你有一定的参考价值。

1、关于namespace

Hbase中的namespace类似于数据库中的database,用于逻辑的划分表。


关于namespace的操作命令:

 Group name: namespace

  Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables

 

1、list_namespace

以下显示namespace有多少个:

hbase(main):027:0> list_namespace

NAMESPACE                            

default                               

hbase                                  

2 row(s) in 0.0290 seconds

可见,默认的情况下已经有两个namespace。分别是defaulthbase。默认情况

 

Java API显示所有namespace

NamespaceDescriptor[] ns =  hbaseadmin.listNamespaceDescriptors();

for(NamespaceDescriptor n:ns) {

System.out.println(n.getName());

}

 

2、list_namespace_tables

命令用于显示某个命名空间下的所有的表。

默认情况下,用户所创建的所有表,都保存在default命名空间下。

hbase(main):028:0> list_namespace_tables "default"

TABLE                                  

atom                                   

stud                                   

xtable   

3 row(s) in 0.0390 seconds

hbase命名空间,保存的是元数据信息。

hbase(main):030:0> list_namespace_tables "hbase"

TABLE                                

meta                                    

namespace                             

2 row(s) in 0.0210 seconds

使用Java API显示这个命名空间下的所有的表:

TableName[] tns =  hbaseadmin.listTableNamesByNamespace("wangjian");

for(TableName t:tns) {

System.out.println(t.getNameAsString());

}

显示的结果会默认带有命名空间的前缀。

3、关于hbase命名空间

现在我们查看一下hbase命令空间下的元数据信息:

先来看看namespace表,为了便于阅读,对输出的数据进行了整理:

hbase(main):035:0* desc "hbase:namespace"

Table hbase:namespace is ENABLED   

hbase:namespace                     

COLUMN FAMILIES DESCRIPTION          

{NAME => 'info',   //列族名称

BLOOMFILTER => 'ROW',  //BloomFilter是一种随机数据结构,比较复杂,请自己去查资料

VERSIONS => '10', //保存的版本数量

IN_MEMORY => 'true', //内存

KEEP_DELETED_CELLS => 'FALSE',

DATA_BLOCK_ENCODING => 'NONE',

TTL => 'FOREVER', //Time To Live 过期时间,永远不过期

COMPRESSION => 'NONE', //是否压缩,否

CACHE_DATA_IN_L1 => 'true', //一级缓存,默认是打开的

MIN_VERSIONS => '0', //最小版本

BLOCKCACHE => 'true', //块缓存打开

BLOCKSIZE => '8192', //块大小8192字节

REPLICATION_SCOPE => '0'//复本范围

}                                

1 row(s) in 0.0630 seconds

 

现在查看namespace表中的数据:

hbase(main):036:0> scan "hbase:namespace"

ROW          COLUMN+CELL                                

 default      column=info:d, timestamp=1528987001513, value=\x0A\x07default  

 hbase      column=info:d, timestamp=1528987001565, value=\x0A\x05hbase       2 row(s) in 0.0570 seconds

可见,里只保存了两条记录,即记录了所有命名空间的名称及其他信息。 

Java代码:

Configuration config = HBaseConfiguration.create();

config.set("hbase.zookeeper.quorum", "192.168.56.91:2181");

Connection con = ConnectionFactory.createConnection(config);

Admin admin = con.getAdmin();

HBaseAdmin hadmin = (HBaseAdmin) admin;

Table table = con.getTable(TableName.valueOf("hbase:namespace"));

Scan scan = new Scan();

ResultScanner rs = table.getScanner(scan);

Iterator<Result> it = rs.iterator();

while (it.hasNext()) {

Result r = it.next();

String rowkey = Bytes.toString(r.getRow());

System.err.println(rowkey);

CellScanner cs = r.cellScanner();

while (cs.advance()) {

Cell cell = cs.current();

System.err.println("\t"+Bytes.toString(CellUtil.cloneFamily(cell))+":"+Bytes.toString(CellUtil.cloneQualifier(cell))

+"="+Bytes.toString(CellUtil.cloneValue(cell)).trim());

}}

rs.close();

table.close();

admin.close();

con.close();

输出的结果为:

default

info:d=default

hbase

info:d=hbase

 

查看hbase:meta表的结构:

hbase(main):038:0> desc "hbase:meta"

Table hbase:meta is ENABLED           

hbase:meta, {TABLE_ATTRIBUTES => {IS_META => 'true', REGION_REPLICATION => '1', coprocessor$1 => '|org.apache.hadoop.hbase.c

oprocessor.MultiRowMutationEndpoint|536870911|'}                               

COLUMN FAMILIES DESCRIPTION           

{NAME => 'info',

BLOOMFILTER => 'NONE',

VERSIONS => '10',

IN_MEMORY => 'true',

KEEP_DELETED_CELLS => 'FALSE',

DATA_BLOCK_ENCODING => 'NONE',

TTL => 'FOREVER',

COMPRESSION => 'NONE',

CACHE_DATA_IN_L1 => 'true',

MIN_VERSIONS => '0',

BLOCKCACHE => 'true',

BLOCKSIZE => '8192',

REPLICATION_SCOPE => '0'}                              

1 row(s) in 0.0180 seconds

 

查询hbase:meta里面的数据:

hbase(main):039:0> scan "hbase:meta"

ROW                              COLUMN+CELL

 stud,,1529201737506.bba14879c16 column=info:regioninfo, timestamp=1529201738216, value={ENCODED => bba14879c16c0a23f9c42c38

 c0a23f9c42c386525a8d8. 6525a8d8, NAME => 'stud,,1529201737506.bba14879c16c0a23f9c42c386525a8d8.', STARTKEY => '',   ENDKEY => ''}                                   

 stud,,1529201737506.bba14879c16 column=info:seqnumDuringOpen, timestamp=1529201738216, value=\x00\x00\x00\x00\x00\x00\x00\x c0a23f9c42c386525a8d8.          02                                      

 stud,,1529201737506.bba14879c16 column=info:server, timestamp=1529201738216, value=hadoop91:46503                          

 c0a23f9c42c386525a8d8.                      

 stud,,1529201737506.bba14879c16 column=info:serverstartcode, timestamp=1529201738216, value=1529200663312   c0a23f9c42c386525a8d8.   

可见,里面保存的,只所有后的源数信息。如info:regionInfo保存了区域信息。     

 

4describe_namespace描述namespace的信息

hbase(main):041:0> describe_namespace "hbase"

DESCRIPTION                           

{NAME => 'hbase'}                     

1 row(s) in 0.0400 seconds

 

5、创建一个命名空间

以下是创建命名空间的语法:

hbase(main):042:0> help "create_namespace"

Create namespace; pass namespace name,

and optionally a dictionary of namespace configuration.

Examples:

  hbase> create_namespace 'ns1'

  hbase> create_namespace 'ns1', {'PROPERTY_NAME'=>'PROPERTY_VALUE'}

创建一个命名空间:

hbase(main):043:0> create_namespace "wangjian"

0 row(s) in 0.0840 seconds

查看所有命名空间:

hbase(main):044:0> list_namespace

NAMESPACE                             

default                                

hbase                                

wangjian                            

3 row(s) in 0.0190 seconds

Java代码创建一个命名空间:

@Test

public void creatNamespace() throws Exception {

NamespaceDescriptor ns = NamespaceDescriptor.create("namespace2").build();

hadmin.createNamespace(ns);

try {

ns = hadmin.getNamespaceDescriptor("namespace2");

if (ns != null) {

System.err.println("创建成功..");

}

} catch (Exception e) {

System.err.println("创建失败..");

}

}

删除命名空间:

hadmin.deleteNamespace("namespace2");

创建表,保存到某个命名空间下:

hbase(main):045:0> create "wangjian:books","info"

0 row(s) in 1.2640 seconds

=> Hbase::Table - wangjian:books

显示所有表,也会包含用户创建的表空间的表:

hbase(main):046:0> list

TABLE                                 

atom                                   

stud                                    

wangjian:books  //这就是自己定义的命名空间的表                 

xtable                                 

4 row(s) in 0.0190 seconds

=> ["atom", "stud", "wangjian:books", "xtable"]

或是使用list_namespace_tables查看某个命名空间下的所有的表:

hbase(main):048:0> list_namespace_tables "wangjian"

TABLE                                  

books                                   

1 row(s) in 0.0200 seconds

 

使用Java API创建一个命名空间:

NamespaceDescriptor ns = NamespaceDescriptor.create("wangjian2").build();

hbaseadmin.createNamespace(ns);

然后再使用java代码将表创建到这个命名空间,就是通过namespace:tableName的方式来指定属于哪一个命名空间:

HTableDescriptor table = new HTableDescriptor(TableName.valueOf("wangjian2:books"));

table.addFamily(new HColumnDescriptor("info2"));

hbaseadmin.createTable(table);

 

6、修改命名空间

 修改命名空间,只用于修改命名空间之前设置的属性,包含设置属性删除某些属性。

如先查询某个命名空间是否包含某些属性:

hbase(main):015:0> describe_namespace "wangjian"

DESCRIPTION                           

{NAME => 'wangjian'}                    

1 row(s) in 0.0250 seconds

可见,没有任何的属性,现在可以通过以下语法,给某个命名空间,设置属性:

alter_namespace 命名空间的名称,{METHOD=>set,SomeProperty=>someValue}

其中上面的METHOD用于说明是设置属性还是删除属性,如果是METHOD=>unset则为删除属性,如果为set则为设置属性。后面的属性key和属性值,必须都用引号,因为属性和属性值,可以任意的指定,如下为指定某些属性:

hbase(main):018:0>alter_namespace "wangjian",{METHOD=>'set','Address'=>'SDJN','Mail'=>'wangjian@126.com'}

0 row(s) in 0.0400 seconds

再次查询,发现已经有了某些属性:

hbase(main):019:0> describe_namespace "wangjian"

DESCRIPTION                        

{NAME => 'wangjian', Address => 'SDJN', Mail => 'wangjian@126.com'}      

1 row(s) in 0.0200 seconds

删除某些属性,请指定Method=unsetproperty_name=..:

hbase(main):002:0> alter_namespace "wangjian",{METHOD=>'unset',NAME=>'Mail'}

0 row(s) in 0.0990 seconds

再次查看命名空间描述,发现已经删除了Mail这个属性:

hbase(main):003:0> describe_namespace "wangjian"

DESCRIPTION                        

{NAME => 'wangjian', Address => 'SDJN'}    

1 row(s) in 0.0140 seconds

Java代码对命名空间的更多操作

也可以通过Java代码,获取一个命名空间的属性信息:

NamespaceDescriptor ns =  hbaseadmin.getNamespaceDescriptor("wangjian2");

Map<String, String> map =  ns.getConfiguration();

 

通过modify方法可以修改命名空间中的属性值:

NamespaceDescriptor ns =  hbaseadmin.getNamespaceDescriptor("wangjian2");

ns.setConfiguration("email","Jerry@163.com");hbaseadmin.modifyNamespace(ns);

 

删除命名空间的某个属性:

NamespaceDescriptor ns =  hbaseadmin.getNamespaceDescriptor("wangjian2");

ns.removeConfiguration("email");

hbaseadmin.modifyNamespace(ns);

 

给命名空间设置属性:

以下通过Java代码来设置:

@Test

public void setNamespaceProperty() throws Exception{

NamespaceDescriptor ns = NamespaceDescriptor.create("namespace2").build();

ns.setConfiguration("someName","someValue");

hadmin.createNamespace(ns);

}

使用shell查询属性信息:
hbase(main):012:0> describe_namespace "namespace2"

DESCRIPTION         

{NAME => 'namespace2', someName => 'someValue'}                

1 row(s) in 0.0300 seconds

使用java代码获取属性信息:

读取所有信息,就是通过NamespaceDescriptor获取Configuration信息。
NamespaceDescriptor ns =  hadmin.getNamespaceDescriptor("namespace2");

Map<String, String> map =  ns.getConfiguration();

System.err.println(map);


 

7、删除命名空间

只能删除一个空的命名空间,即这个命名空间下,没有任何表。否则删除将失败。

先禁用这个表空间下的所有的表,注意使用正则表达式:

hbase(main):012:0> disable_all "wangjian:.*"

wangjian:books                      

Disable the above 1 tables (y/n)?

y

1 tables successfully disabled

然后删除这个命名空间下的所有的表:

hbase(main):013:0> drop_all "wangjian:.*"

wangjian:books                      

Drop the above 1 tables (y/n)?

y

1 tables successfully dropped

现在就可以删除这个表空间了:

hbase(main):015:0> drop_namespace "wangjian"

0 row(s) in 0.0520 seconds

 

Java API删除表空间之前,请先用正则表达式禁用及删除这个表空间下的所有的表:

hbaseadmin.disableTables("wangjian2:.*");

hbaseadmin.deleteTables("wangjian2:.*");

hbaseadmin.deleteNamespace("wangjian2");



以上是关于HBase之namespace的主要内容,如果未能解决你的问题,请参考以下文章

大数据之Hbase:HBase之读写数据流程

hbase系列之初识hbase

深入浅出之命名空间

hbase系列之:独立模式部署hbase

python进阶之命名空间与作用域

大数据之Hbase:HBase简介