大数据数据库之HBase

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 查看有哪些表

  • 查看当前数据库中有哪些表
  1. 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 查询数据操作

4.6.1 通过rowkey进行查询

  • 获取user表中row key为rk0001的所有信息(即所有cell的数据)
  • 使用get命令

HBase(main):015:0> get 'user', 'rk0001'

4.6.2 查看rowkey下某个列族的信息

  • 获取user表中row key为rk0001,info列族的所有信息

HBase(main):016:0> get 'user', 'rk0001', 'info'

4.6.3 查看rowkey指定列族指定字段的值

  • 获取user表中row key为rk0001,info列族的name、age列的信息

HBase(main):017:0> get 'user', 'rk0001', 'info:name', 'info:age'

uploading.4e448015.gif转存失败重新上传取消

4.6.4 查看rowkey指定多个列族的信息

  • 获取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']}

4.6.5 指定rowkey与列值过滤器查询

  • 获取user表中row key为rk0001,cell的值为zhangsan的信息

HBase(main):030:0> get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"}

4.6.6 指定rowkey与列名模糊查询

  • 获取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:中国')"}

4.6.7 查询所有行的数据

  • 查询user表中的所有信息
  • 使用scan命令

HBase(main):032:0>  scan 'user'

4.6.8 列族查询

  • 查询user表中列族为info的信息

scan 'user', {COLUMNS => 'info'}

scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}

scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}

4.6.9 多列族查询

  • 查询user表中列族为info和data的信息

scan 'user', {COLUMNS => ['info', 'data']}

4.6.10 指定列族与某个列名查询

  • 查询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}

4.6.11 指定多个列族与按照数据值模糊查询

  • 查询user表中列族为info和data且列标示符中含有a字符的信息

scan 'user', {COLUMNS => ['info', 'data'], FILTER => "QualifierFilter(=,'substring:a')"}

4.6.12 指定rowkey的范围查询

  • 查询user表中列族为info,rk范围是[rk0001, rk0003)的数据

scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

4.6.13 指定rowkey前缀查询

  • 查询user表中row key以rk字符开头的数据

scan 'user',{FILTER=>"PrefixFilter('hbase')"}

4.6.14 指定数据版本的范围查询

  • 查询user表中指定范围的数据(前闭后开)

scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}

4.7 更新数据操作

4.7.1 更新数据值

  • 更新操作同插入操作一模一样,只不过有数据就更新,没数据就添加
  • 使用put命令

向user表中插入信息,更新row key为rk0001,列族info中age列的值为21
HBase(main):013:0> put 'user', 'rk0001', 'info:age', 21

4.7.2 更新版本号

  • 将user表的f1列族版本数改为5

HBase(main):050:0> alter 'user', NAME => 'info', VERSIONS => 5

4.8 删除数据以及删除表操作

4.8.1

  • 删除user表row key为rk0001,列标示符为info:name的数据

HBase(main):045:0> delete 'user', 'rk0001', 'info:name'

4.8.2 指定rowkey,列名以及版本号进行删除

  • 删除user表row key为rk0001,列标示符为info:name,timestamp为1392383705316的数据

delete 'user', 'rk0001', 'info:name', 1392383705316

4.8.3 删除一个列族

  • 删除一个列族:

alter 'user', NAME => 'info', METHOD => 'delete' 

或 alter 'user', 'delete' => 'info'

4.8.4 清空表数据

HBase(main):017:0> truncate 'user'

4.8.5 删除表

  • 首先需要先让该表为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'

发布了31 篇原创文章 · 获赞 20 · 访问量 3075

猜你喜欢

转载自blog.csdn.net/fengge18306/article/details/105325853