what's

中文文档
来自于BigTable。
HBase是参考google的bigtable的一个开源产品,建立在hdfs之上的一个提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。
是一种介于nosql和RDBMs之间的一种数据库系统,仅支持通过rowkey和range进行数据的检索,主要存储非结构化数据和半结构化数据。

HBase和Hadoop一样,目标是通过横向扩展,添加普通机器来增加存储性能和计算性能。
HBase特点:大(一个表可以有上亿行以及百万级的行)、面向行存储、稀疏(由于null不占用存储空间,所有表结果可以设计的非常稀疏)。

架构

HBase使用Zookeeper进行集群节点管理,当然HBase自身集成了一个ZK系统,不过一般情况在实际生产环境中不使用。
HBase由master和regionserver两类节点(如果使用HBase自带的zk服务,那么还有HQuorumPeer进程)。
Hbase支持提供backup master进行master备份。其中master节点负责和zk进行通信以及存储regionserver的相关位置信息,regionserver节点实现具体对数据的操作,最终数据存储在hdfs上。

物理存储:hbase的持久化数据是存放在hdfs上
存储管理:一个表是划分为很多region的,这些region分布式地存放在很多regionserver上(1台机器对应一个regionServer)。region内部还可以划分为store,store内部有memstore和storefile

clipboard.png

版本管理:hbase中的数据更新本质上是不断追加新的版本,通过compact操作来做版本间的文件合并region的split

集群管理:zookeeper + hmaster + hregionserver

web管理界面:http://host:60010/

hbase数据

HBase逻辑存储结构

row key是一张表中某一列数据的唯一标识。
时间戳,记录数据的更新、版本。
column family是列簇(可以有多个),cf包含一个或多个相关的列column01,column02,.....。

clipboard.png

HBase物理存储结构

clipboard.png

Hbase Shell操作

$ bin/hbase shell进入hbase的shell客户端,对数据的操作主要分为DDL和DML两大类。不用";"。shift+delete才能前删。

命名空间

类似关系型数据库中的database,作用是将hbase的表按照业务作用分割开,有益于维护。
Hbase默认有两个命名空间,分别是hbase和default。其中hbase命名空间存储hbase自身的表信息,default存储用户创建的表。
create_namespace创建命名空间,alter_namespace命名空间修改describe_namespace显示命名空间描述信息,drop_namespace`删除命名空间,注意删除的命名空间内不能有table存在,也就是说只能删除空的namespace。
list_namespace显示所有命名空间,list_namespace_tables显示对于命名空间中的table名称,参数可以是正则形式。后面参数放引号里。

list

作用:显示hbase表名称,类似mysql中的show tables;
可以通过指定命名空间来查看对应命名空间中的表,默认是显示所有用户表,也支持模糊匹配。类似命令list_namespace_tables查看对应命名空间内有那些表。

create

> help "create"可查看用法。
创建一个表,指定命名空间、表名
hbase> create 'ns1:t1'会提示表必须至少有一个列簇!

hbase> create 'ns1:table1', {NAME => 'f1', VERSIONS => 5}这里指定了一个列簇f1,并增加版本信息。
还可以加更多信息 hbase> create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}
hbase> create 't1', {NAME => 'f1', CONFIGURATION => {'hbase.hstore.blockingStoreFiles' => '10'}}

还可以为表加配置信息 hbase> create 't1', {NAME => 'f1', VERSIONS => 5}, METADATA => { 'mykey' => 'myvalue' }hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40']hbase> create 't1', 'f1', SPLITS_FILE => 'splits.txt', OWNER => 'johndoe'

hbase> create 'ns1:table2', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}指定了多个列簇。
简写:hbase> create 't1', 'f1', 'f2', 'f3'

>describe 'table1'查看表的描述信息

创建预分区表

默认情况的情况下,创建一个HBase表,自动为表分配一个Region。
create 'table_logs', 'info', SPLITS => ['20151001000000000', '20151011000000000', '20151021000000000']
3+1个region

drop

删除用户表之前需要将表设置为disable的,然后才可以删除。
其实在hbase中如果需要对已有表进行ddl操作,均需要将其disable,在ddl操作完成后,再进行enable操作即可。
> disable '[namespace_name:]table_name'
> drop '[namespace_name:]table_name'

put

put命令是进行数据添加的命令。
> put '[namespace_name:]table_name', 'rowkey', 'family:[column]', 'value' [, timestamp] [, {ATTRIBUTES=>{'mykey'=>'myvalue'}, VISIBILITY=>'PRIVATE|SECRET'}]
示例:> put 'users','row1','f1:id','1'
>put 'user', '10001', 'info:name', 'zhangsan'
分别指定表名(可以不带命名空间),列簇名,列名(指定所在的列簇),值,默认时间戳

gives you a reference to the table named 't1', on which you can then call methods.

> t=get_table 'cyan:table2'得到了一个引用后t.put 'r3', 'f1:id', '9'
> t.get 'r3'
也可以用这种方式创建表hbase> t1 = create 't1', 'f1'

delete

删除某列column数据,
> delete '[namespace:]table_name', 'rowkey', 'family:column'
> delete 'user', '10001', 'info:age'
如果需要删除当然rowkey的所有列数据,那么可以使用deleteall命令。
> deleteall 'user', '10001' 10001的全没了

truncate

是清空数据库,当我们数据库中的数据比较多的时候,我们可以选择该命令将数据库清空。
> truncate '[namespace_name:]table_name'

查询数据

HBase数据查询有三种方式:

get

依据rowkey查询,最快的。
获取对应表中对应rowkey的数据。默认获取最新版本的全部列数据,可以通过时间戳指定版本信息,也可以指定获取的列。
> get '[namespace_name:]table_name', 'rowkey'
示例:> get 'users','row1'
>get 'user', '10001', 'info:name'得到该row的name值
>get 'user', '10001', 'info:name', 'info:age'得到该row的name值和age值

scan range

通过指定column和filter等相关信息进行数据的过滤。范围查询都写在"{}"中。用的最多。

> scan 'users', {COLUMN=>['f1:id']} 会返回有列簇f1且列名为id的row的条数,还有该列的值。

> scan 'users', {COLUMN=>['f1:id','f2:name']} 会返回有列簇f1且列名为id的 或 会返回有列簇f2且列名为name的 row的条数,还有该列的值。

> scan 'users', {STARTROW=>'row1',ENDROW=>'row2'}开始扫描的rowkey,结束扫描的rowkey,获取行数等信息。包头不包尾!

> scan 'users', {LIMIT=>1}返回前1条row。

常用filter命令有:ColumnPrefixFilter,MultipleColumnPrefixFilter,RowFilter,SingleColumnValueFilter,SingleColumnValueExcludeFilter等。
需要注意的是:在指定的value之前需要加'binary:'!最后会转为是二进制的字符串数组。
> scan 'users',{FILTER=>"SingleColumnValueFilter('f','id',=,'binary:1)"}指定了f列簇下列名为id且值为1
> scan 'users', {FILTER=>"RowFilter(>=,'binary:row8')"}
> scan 'users', {FILTER=>"SingleColumnValueFilter('f','id',=,'binary:2')"}
`> scan 'users', {FILTER=>"SingleColumnValueFilter('f','id',<,'binary:3') OR RowFilter(>,'binary:row7')"}

> scan 'users', {FILTER=>"ColumnPrefixFilter('id')"}
> scan 'users', {FILTER=>"MultipleColumnPrefixFilter('id', 'name')"}

各种条件都可以写在"{}"中,用逗号隔开取交集。

scan

全表扫描。
> scan '[namespace_name:]table_name'
示例:> scan 'users'

count

是统计hbase表行数的一个命令,由于相当于一个内置的mapreduce程序,所以当数据量比较大的时候可以选择使用协处理器方式计算行数。
> count '[namespace:]table_name' [INTERVAL => 1000,] [CACHE => 10]
默认情况下INTERVAL是1000(间隔数),CACHE是10。

status

作用:查看hbase集群状态信息。

参数:simple,summary,detailed;默认是summary。

Hbase java api

http://hbase.apache.org/apidocs/

HBase MapReduce

http://www.kuqin.com/database...


cashew
9 声望3 粉丝

« 上一篇
Mysql梳理1
下一篇 »
hive梳理

引用和评论

0 条评论