实时读写的NoSQL数据库(一):HBase概述
Hive对MapReduce做了上层封装,那么有没有一种技术对HDFS实现上层封装,从而解决HDFS不适合低延时数据访问的问题呢?这时候HBase就闪亮登场了。
1. 简介
HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库
建立在 HDFS 之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的 NoSQL 数据库系统
仅能通过主键(row key)和主键的 range 来检索数据
Hbase查询数据功能简单,不支持 join 等复杂操作
不支持复杂的事务(行级的事务)
Hbase 中支持的数据类型:byte[]
主要用来存储结构化和半结构化的数据
1.1 HBASE数据模型
逻辑上:HBase的数据模型同关系型数据库类似,数据存储在一张表中,有行有列
底层物理存储结构:HBase存储的是 K-V 键值对,更像是一个multi-dimensional map
1.1.1 逻辑结构
rowkey:行键,HBase通过行键来唯一标识一行数据
Rowkey 行键 (Rowkey)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10- 100bytes)
在 HBase 内部,rowkey 保存为字节数组
HBase 会对表中的数据按照 Rowkey 排序(字典顺序)
存储时,数据按照 Rowkey 的字典序(byte order)排序存储
设计 key 时,要利用排序存储这个特性,将经常一起读取的行存储放到一起
column family:列簇,属于schema的一部分,在创建表时需要定义
列簇越多,在取一行数据时所要参与 IO、搜寻的文件就越多
如果没有必要,不要设置太多的列簇
column:列,列簇中的一部分,可以在表创建后按需增加
列名都以列簇作为前缀
region:HBase中将多行数据合并为一个region,类似于关系型数据库中的表
store:rowkey+一个列簇为一个store,在底层存储为多个store file
1.1.2 物理结构
数据在底层以storefile的形式存储
一行数据存储为多个版本,通过Timestamp进行区分
Type:有Put和Delete两个类型,在删除时T3一定要大于T2,才能删除掉
1.1.3 数据模型
NameSpace:命名空间,类似于DatabBase概念,每个命名空间下有多个表
HBase有两个自带的命名空间,分别是hbase和default
hbase中存放的是HBase内置的表
default表是用户默认使用的命名空间
Region:类似于表概念
HBase定义表时只需要声明列簇,不需要声明具体的列
往HBase写入数据时,字段可以动态、按需指定
Row:每行数据都由一个RowKey和多个Column(列)组成
数据按照RowKey的字典顺序存储的
查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要
Column:每个列都由Column Family(列簇)和Column Qualifier(列限定符)进行限定
例如info:name,info:age
建表时,只需指明列簇,列限定符无需预先定义
Timestamp:用于标识数据的不同版本(version)
每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入HBase的时间
时间戳的类型是 64 位整型
如果应用程序要避免数据版本冲突,必须自己生成具有唯一性的时间戳
每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面
Cell:由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元
cell中的数据是没有类型的,全部是字节数组形式存储
1.2 基本架构
RegionServer:Region的管理者,其实现类为HRegionServer,主要用于:
对于数据的操作:get、put、delete;
对于Region的操作:splitRegion、compactRegion
Master:所有Region Server的管理者,其实现类为HMaster,主要用于:
对于表的操作:create,、delete、alter;
对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移
ZK:通过Zookeeper完成Master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作
HDFS:HDFS为HBase提供最终的底层数据存储服务,同时为HBase提供高可用的支持
2. Shell 操作
2.1 基本操作
# 1. 进入HBase客户端命令行
bin/hbase shell
# 2. 查看帮助命令
help
# 3. 查看当前数据库中有哪些表
list
2.2 NameSpace操作
# 1. 查看名称空间
list_namespace
# 2. 创建名称空间
create_namespace 'ns'
# 3. 在名称空间建表
create "ns:stu","info"
# 4. 删除名称空间
# 4.1 先删除表
disable "ns:stu"
drop "ns:stu"
# 4.2 删除名称空间
drop_namespace "ns"
2.3 表操作
# 1. 创建表
create 'student','info'
# 2. 插入数据
put 'student','1001','info:sex','male'
put 'student','1001','info:age','18'
put 'student','1001','info:name','zhangsan'
put 'student','1002','info:name','lisi'
put 'student','1002','info:age','22'
# 3. 扫描查看数据
scan 'student'
# 前闭后开
scan 'student',{STARTROW => '1001',STOPROW => '1001'}
scan 'student',{STARTROW => '1001'}
# 4. 查看表结构
describe 'student'
# 5. 更新指定字段的数据
put 'student','1001','info:name','wangwu'
# 6. 查看指定行或指定列的数据
get 'student','1001'
get 'student','1001','info:name'
# 7. 统计表行数
count 'student'
# 8. 删除数据
# 8.1 删除某rowkey的全部数据
deleteall 'student','1001'
# 8.2 删除某rowkey的某一列数据
delete 'student','1002','info:name'
# 9. 清空表数据
disable 'student'
truncate 'student'
# 10. 删除表
disable 'student'
drop 'student'
# 11. 变更表信息
alter 'student',{NAME=>'info',VERSIONS=>3}