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
版本管理:hbase 中的数据更新本质上是不断追加新的版本,通过 compact 操作来做版本间的文件合并 region 的 split
集群管理:zookeeper + hmaster + hregionserver
web 管理界面:http://host:60010/
hbase 数据
HBase 逻辑存储结构
row key 是一张表中某一列数据的唯一标识。
时间戳,记录数据的更新、版本。
column family 是列簇(可以有多个),cf 包含一个或多个相关的列 column01,column02,…..。
HBase 物理存储结构
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…