菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
199
0

HBase

原创
05/13 14:22
阅读数 13261

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 中的行,只有三种方式:

  1. 通过单个 row key 访问

  2. 通过 row key 的 range

  3. 全表扫描

列族: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 架构

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

 

发表评论

0/200
199 点赞
0 评论
收藏
为你推荐 换一批