vlambda博客
学习文章列表

实时读写的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 数据模型

  1. NameSpace:命名空间,类似于DatabBase概念,每个命名空间下有多个表

    1. HBase有两个自带的命名空间,分别是hbasedefault

    2. hbase中存放的是HBase内置的表

    3. default表是用户默认使用的命名空间

  1. Region:类似于表概念

    1. HBase定义表时只需要声明列簇,不需要声明具体的列

    2. 往HBase写入数据时,字段可以动态按需指定

  1. Row:每行数据都由一个RowKey和多个Column(列)组成

    1. 数据按照RowKey的字典顺序存储

    2. 查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要

  1. Column:每个列都由Column Family(列簇)Column Qualifier(列限定符)进行限定

    1. 例如info:name,info:age

    2. 建表时,只需指明列簇,列限定符无需预先定义

  1. Timestamp:用于标识数据的不同版本(version)

    1. 每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入HBase的时间

    2. 时间戳的类型是 64 位整型

    3. 如果应用程序要避免数据版本冲突,必须自己生成具有唯一性的时间戳

    4. 每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面

  1. Cell:由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元

    1. cell中的数据是没有类型的,全部是字节数组形式存储

1.2 基本架构

  1. RegionServer:Region的管理者,其实现类为HRegionServer,主要用于:

    1. 对于数据的操作:get、put、delete;

    2. 对于Region的操作:splitRegion、compactRegion

  1. Master:所有Region Server的管理者,其实现类为HMaster,主要用于:

    1. 对于表的操作:create,、delete、alter;

    2. 对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移

  1. ZK:通过Zookeeper完成Master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作

  2. 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}