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。分别是default和hbase。默认情况
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保存了区域信息。
4、describe_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=unset和property_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的主要内容,如果未能解决你的问题,请参考以下文章