1. HBase是什么
1.1 HBase的概念
- HBase即Hadoop Database,是Hadoop的分布式的数据库。
- HBase是参考Google的BigTable论文的开源实现版,HBase的存储基于HDFS,提供高可靠性、高性能、列存储、可伸缩、实时读写的分布式数据库系统。
- 在需要实时读写随机访问超大规模数据集时,可以使用HBase。
1.2 HBase的特点
- 海量存储
- 可以存储大批量的数据
- 单表可容纳数十亿行,上百万列
- 极易扩展
- 底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点就可以了
- 可以通过增加服务器来对集群的存储进行扩容
- 列式存储
- HBase表的数据是基于列族进行存储的,列族是在列的方向上的划分。
- 稀疏
- 稀疏主要是针对HBase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
- 数据类型单一
- 所有的数据在HBase中是以字节数组进行存储
- 数据的多版本
- HBase表中的数据可以有多个版本值,默认情况下是根据版本号去区分,版本号就是插入数据的时间戳
- 高并发
- 支持高并发的读写请求
2. HBase表的数据模型(5个)
2.1 rowkey行键
- table的主键,table中的记录按照rowkey 的字典序进行排序
- Row key行键可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes)
2.2 Column Family列族
- 列族或列簇
- HBase表中的每个列,都归属于某个列族
- 列族是表的schema的一部分(而列不是),即建表时至少指定一个列族
- 比如创建一张表,名为user,有两个列族,分别是info和data,建表语句create 'user', 'info', 'data'
2.3 Column列
- 列肯定是表的某一列族下的一个列,用列族名:列名表示,如info列族下的name列,表示为info:name
- 属于某一个ColumnFamily,类似于我们mysql当中创建的具体的列
2.4 cell单元格
- 指定row key行键、列族、列,可以确定的一个cell单元格
- cell中的数据是没有类型的,全部是以字节数组进行存储
2.5 Timestamp时间戳
- 可以对表中的Cell多次赋值,每次赋值操作时的时间戳timestamp,可看成Cell值的版本号version number
- 即一个Cell可以有多个版本的值
3. HBase整体架构
3.1 Client客户端
- Client是操作HBase集群的入口
- 对于管理类的操作,如表的增、删、改操纵,Client通过RPC与HMaster通信完成
- 对于表数据的读写操作,Client通过RPC与RegionServer交互,读写数据
- Client类型:
- HBase shell
- Java编程接口
- Thrift、Avro、Rest等等
3.2 ZooKeeper集群
- 作用
- 实现了HMaster的高可用,多HMaster间进行主备选举
- 对HMaster和HRegionServer实现了监控
- 保存了HBase的元数据信息meta表,提供了HBase表中region的寻址入口的线索数据
3.3 HMaster
- HBase集群也是主从架构,HMaster是主的角色
- 主要负责Table表和Region的相关管理工作:
- 关于Table
- 管理Client对Table的增删改的操作
- 关于Region
- 在Region分裂后,负责新Region分配到指定的HRegionServer上
- 管理HRegionServer间的负载均衡,迁移region分布
- 当HRegionServer宕机后,负责其上的region的迁移
- 以上核心思想就是分散存储,提高性能
3.4 HRegionServer
- HBase集群中从的角色,是小弟
- 作用
- 响应客户端的读写数据请求
- 负责管理一系列的Region
- 切分在运行过程中变大的region
3.5 Region
- HBase集群中分布式存储的最小单元
- 一个Region存储一个Table表的部分数据
3.6HBase使用,主要有两种形式:①命令;②Java编程
4. HBase shell 命令基本操作
4.1 进入HBase客户端命令操作界面
- node01执行以下命令,进入HBase的shell客户端
cd /install/hbase-1.2.0-cdh5.14.2/bin
hbase shell
4.2 help 帮助命令
HBase(main):001:0> help
4.3 list 查看有哪些表
- 查看当前数据库中有哪些表
- HBase(main):002:0> list
4.4 create 创建表
- 创建user表,包含info、data两个列族
- 使用create命令
HBase(main):010:0> create 'user', 'info', 'data'
或者
HBase(main):010:0> create 'user', {NAME => 'info', VERSIONS => '3'},{NAME => 'data'}
4.5 put 插入数据操作
- 向表中插入数据
- 使用put命令
向user表中插入信息,row key为rk0001,列族info中添加名为name的列,值为zhangsan
HBase(main):011:0> put 'user', 'rk0001', 'info:name', 'zhangsan'
向user表中插入信息,row key为rk0001,列族info中添加名为gender的列,值为female
HBase(main):012:0> put 'user', 'rk0001', 'info:gender', 'female'
向user表中插入信息,row key为rk0001,列族info中添加名为age的列,值为20
HBase(main):013:0> put 'user', 'rk0001', 'info:age', 20
向user表中插入信息,row key为rk0001,列族data中添加名为pic的列,值为picture
HBase(main):014:0> put 'user', 'rk0001', 'data:pic', 'picture'
向user表中插入信息,row key为hbase0001,列族data中添加名为pic的列,值为picture
HBase(main):015:0> put 'user', 'hbase0001', 'data:pic', 'picture'
4.6 查询数据操作
- 获取user表中row key为rk0001的所有信息(即所有cell的数据)
- 使用get命令
HBase(main):015:0> get 'user', 'rk0001'
- 获取user表中row key为rk0001,info列族的所有信息
HBase(main):016:0> get 'user', 'rk0001', 'info'
- 获取user表中row key为rk0001,info列族的name、age列的信息
HBase(main):017:0> get 'user', 'rk0001', 'info:name', 'info:age'
- 获取user表中row key为rk0001,info、data列族的信息
HBase(main):018:0> get 'user', 'rk0001', 'info', 'data'
或者你也可以这样写
HBase(main):019:0> get 'user', 'rk0001', {COLUMN => ['info', 'data']}
或者你也可以这样写,也行
HBase(main):020:0> get 'user', 'rk0001', {COLUMN => ['info:name', 'data:pic']}
- 获取user表中row key为rk0001,cell的值为zhangsan的信息
HBase(main):030:0> get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"}
- 获取user表中row key为rk0001,列标示符中含有a的信息
HBase(main):031:0> get 'user', 'rk0001', {FILTER => "QualifierFilter(=,'substring:a')"}
继续插入一批数据
HBase(main):032:0> put 'user', 'rk0002', 'info:name', 'fanbingbing'
HBase(main):033:0> put 'user', 'rk0002', 'info:gender', 'female'
HBase(main):034:0> put 'user', 'rk0002', 'info:nationality', '中国'
HBase(main):035:0> get 'user', 'rk0002', {FILTER => "ValueFilter(=, 'binary:中国')"}
- 查询user表中的所有信息
- 使用scan命令
HBase(main):032:0> scan 'user'
- 查询user表中列族为info的信息
scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}
- 查询user表中列族为info和data的信息
scan 'user', {COLUMNS => ['info', 'data']}
- 查询user表中列族为info、列标示符为name的信息
scan 'user', {COLUMNS => 'info:name'}
- 查询info:name列、data:pic列的数据
scan 'user', {COLUMNS => ['info:name', 'data:pic']}
- 查询user表中列族为info、列标示符为name的信息,并且版本最新的5个
scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}
- 查询user表中列族为info和data且列标示符中含有a字符的信息
scan 'user', {COLUMNS => ['info', 'data'], FILTER => "QualifierFilter(=,'substring:a')"}
- 查询user表中列族为info,rk范围是[rk0001, rk0003)的数据
scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}
- 查询user表中row key以rk字符开头的数据
scan 'user',{FILTER=>"PrefixFilter('hbase')"}
- 查询user表中指定范围的数据(前闭后开)
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
4.7 更新数据操作
- 更新操作同插入操作一模一样,只不过有数据就更新,没数据就添加
- 使用put命令
向user表中插入信息,更新row key为rk0001,列族info中age列的值为21
HBase(main):013:0> put 'user', 'rk0001', 'info:age', 21
- 将user表的f1列族版本数改为5
HBase(main):050:0> alter 'user', NAME => 'info', VERSIONS => 5
4.8 删除数据以及删除表操作
- 删除user表row key为rk0001,列标示符为info:name的数据
HBase(main):045:0> delete 'user', 'rk0001', 'info:name'
- 删除user表row key为rk0001,列标示符为info:name,timestamp为1392383705316的数据
delete 'user', 'rk0001', 'info:name', 1392383705316
- 删除一个列族:
alter 'user', NAME => 'info', METHOD => 'delete'
或 alter 'user', 'delete' => 'info'
HBase(main):017:0> truncate 'user'
- 首先需要先让该表为disable状态,使用命令:
HBase(main):049:0> disable 'user'
- 然后使用drop命令删除这个表
HBase(main):050:0> drop 'user'
(注意:如果直接drop表,会报错:Drop the named table. Table must first be disabled)
4.9 统计一张表有多少行数据
HBase(main):053:0> count 'user'
5. HBase的高级shell管理命令
5.1 status
- 例如:显示服务器状态
HBase(main):058:0> status 'node01'
5.2 whoami
- 显示HBase当前用户,例如:
HBase> whoami
5.3 list
- 显示当前所有的表
HBase > list
5.4 count
- 统计指定表的记录数,例如:
HBase> count 'user'
5.5 describe
- 展示表结构信息
HBase> describe 'user'
5.6 exists
- 检查表是否存在,适用于表量特别多的情况
HBase> exists 'user'
5.7 isenabled、isdisabled
- 检查表是否启用或禁用
HBase> is_enabled 'user'
HBase> is_disabled 'user'
5.8 alter
- 该命令可以改变表和列族的模式,例如:
- 为当前表增加列族:
HBase> alter 'user', NAME => 'info', VERSIONS => 2
- 为当前表删除列族:
HBase(main):002:0> alter 'user', 'delete' => 'info'
5.9 disable/enable
- 禁用一张表/启用一张表
HBase> disable 'user'
HBase> enable 'user'
5.10 drop
- 删除一张表,记得在删除表之前必须先禁用
HBase> disable 'user'
HBase> drop 'user'
5.11 truncate
- 禁用表-删除表-创建表
HBase> truncate 'user'