HBase
1. HBase 简介
- 1.1 什么是 HBase?
- 1.2 概念
- 1.3 HBase 存储
- 1.4 HBase 架构
2. HBase 命令
1. HBase 简介
1.1 什么是 HBase?
HBase(Hadoop Database)是一个高可靠性、高性能、面向列的、可伸缩的分布式存储系统。利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。
Hbase 是一种基于 Hadoop 的 NoSQL(Key/Value)数据库。
HBase 利用 Hadoop HDFS 作为其文件存储系统,利用 Hadoop MapReduce 来处理 HBase 中的海量数据,并利用 Zookeeper 作为协调工具。
1.2 概念
主键:Row Key
主键是用来检索记录的主键,访问 HBase Table 中的行,只有三种方式:
-
通过单个 row key 访问
-
通过 row key 的 range
-
全表扫描
列族:Column Family
列族在创建表的时候声明,一个列族可以包含多个列,列中的数据都是以二进制形式存在,没有数据类型。
时间戳:timestamp
HBase 中通过 row 和 columns 确定的一个存储单元,称为 cell。每个 cell 都保存着同一份数据的多个版本。版本通过时间戳来索引。
1.3 HBase 存储
Table 在行的方向上分割为多个 HRegion,一个 region 由 [startkey,endkey) 表示,每个 HRegion 分散在不同的 RegionServer 中 。
参数:hbase.hregion.max.filesize
1.4 HBase 架构
Client
- 包含访问 HBase 的接口,Client 维护着一些 Cache 来加快对 HBase 的访问,比如 Region 的位置信息。
Zookeeper
- 保证任何时候,集群中只有一个 Running Master。
- 存贮所有 Region 的寻址入口。
- 实时监控 Region Server 的状态,将 Region Server 的上线和下线信息,实时通知给 Master。
- 存储 HBase 的 Schema,包括有哪些 Table,每个 Table 有哪些 Column Family。
Master
- 可以启动多个 HMaster,通过 Zookeeper 的 Master Election 机制保证总有一个 Master 运行。
- 为 Region Server 分配 Region。
- 负责 Region Server 的负载均衡。
- 发现失效的 Region Server 并重新分配其上的 Region。
Region Server
- 维护 Master 分配给它的 Region,处理对这些 Region 的 I/O 请求。
- 负责切分在运行过程中变得过大的 Region。
可以看出,Client 访问 HBase 上数据的过程并不需要 Master 参与,寻址访问先 Zookeeper 再 Regionserver,数据读写访问 RegionServer。
HRegion Server 主要负责响应用户I/O请求,向 HDFS 文件系统中读写数据,是 HBase 中最核心的模块。
2. HBase 命令
bin 目录进入 HBase 命令行:
./hbase shell
显示 HBase 中的表:
list
创建 user 表,包含 info、data 两个列族:
create 'user', 'info1', 'data1' create 'user', {NAME => 'info', VERSIONS => '3'}
put:添加数据
向 user 表中插入信息,row key 为 rk0001,列族 info 中添加 name 列标示符,值为 zhangsan:
put 'user', 'rk0001', 'info:name', 'zhangsan'
向 user 表中插入信息,row key为 rk0001,列族 info 中添加 gender 列标示符,值为 female:
put 'user', 'rk0001', 'info:gender', 'female'
向 user 表中插入信息,row key为 rk0001,列族 info 中添加 age 列标示符,值为 20:
put 'user', 'rk0001', 'info:age', 20
向 user 表中插入信息,row key为 rk0001,列族 data 中添加 pic 列标示符,值为 picture:
put 'user', 'rk0001', 'data:pic', 'picture'
get:获取一行
获取 user 表中 row key 为 rk0001 的所有信息:
get 'user', 'rk0001'
获取 user 表中 row key 为 rk0001,info 列族的所有信息:
get 'user', 'rk0001', 'info'
获取 user 表中 row key 为 rk0001,info 列族的 name、age 列标示符的信息:
get 'user', 'rk0001', 'info:name', 'info:age'
获取 user 表中 row key 为 rk0001,info、data 列族的信息:
get 'user', 'rk0001', 'info', 'data' get 'user', 'rk0001', {COLUMN => ['info', 'data']} get 'user', 'rk0001', {COLUMN => ['info:name', 'data:pic']}
获取 user 表中 row key 为 rk0001,列族为 info,版本号最新 5 个的信息:
(version 默认是 1,即一个 cell 只能存一个数据;可能存在内存未清理旧 version 的数据,刷新内存或重启即可)
get 'people', 'rk0002', {COLUMN => 'info', VERSIONS => 2} get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5} get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5, TIMERANGE => [1392368783980, 1392380169184]}
获取 user 表中 row key 为 rk0001,cell 的值为 zhangsan 的信息:
get 'people', 'rk0001', {FILTER => "ValueFilter(=, 'binary:图片')"}
获取 user 表中 row key 为 rk0001,列标示符中含有 a 的信息:
get 'people', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}
scan:获取全表
查询 user 表中的所有信息:
scan 'user'
查询 user 表中列族为 info 的信息:
scan 'people', {COLUMNS => 'info'} scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5} scan 'persion', {COLUMNS => 'info', RAW => true, VERSIONS => 3}
查询 user 表中列族为 info 和 data 的信息:
scan 'user', {COLUMNS => ['info', 'data']} scan 'user', {COLUMNS => ['info:name', 'data:pic']}
查询 user 表中列族为 info、列标示符为 name 的信息:
scan 'user', {COLUMNS => 'info:name'}
查询 user 表中列族为 info,列标示符为 name 的信息,并且版本最新的 5 个:
scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}
查询 user 表中列族为 info 和 data 且列标示符中含有 a 字符的信息:
scan 'people', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}
查询 user 表中列族为 info,rk 范围是 [rk0001, rk0003) 的数据:
scan 'people', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}
查询 user 表中 row key 以 rk 字符开头的:
scan 'user',{FILTER=>"PrefixFilter('rk')"}
查询 user 表中指定范围的数据:
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
删除数据
删除 user 表 row key 为 rk0001,列标示符为 info:name 的数据:
delete 'people', 'rk0001', 'info:name'
删除 user 表 row key 为 rk0001,列标示符为 info:name,timestamp 为 1392383705316 的数据:
delete 'user', 'rk0001', 'info:name', 1392383705316
清空 user 表中的数据:
truncate 'people'
修改表结构
添加两个列族 f1 和 f2:
alter 'people', NAME => 'f1' alter 'user', NAME => 'f2'
删除一个列族:
alter 'user', NAME => 'f1', METHOD => 'delete' -- 或 alter 'user', 'delete' => 'f1'
添加列族 f1 的同时删除列族 f2:
alter 'user', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}
将 user 表的 f1 列族版本号改为 5:
alter 'people', NAME => 'info', VERSIONS => 5
删除表:
drop 'user'
修改表名:
get 'person', 'rk0001', {FILTER => "ValueFilter(=, 'binary:中国')"} get 'person', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"} scan 'person', {COLUMNS => 'info:name'} scan 'person', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"} scan 'person', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'} scan 'person', {COLUMNS => 'info', STARTROW => '20140201', ENDROW => '20140301'} scan 'person', {COLUMNS => 'info:name', TIMERANGE => [1395978233636, 1395987769587]} delete 'person', 'rk0001', 'info:name' alter 'person', NAME => 'ffff' alter 'person', NAME => 'info', VERSIONS => 10