Hbase入门篇02---数据模型和基本使用
- HBase数据模型
- 表
- 行
- 列
- 单元格 (cell)
- 概念模型
- shell命令行进行CRUD操作
- 表的CRUD
- 数据的CRUD
- 数据批量导入
- 计数操作
- 大量数据的计数统计
- 扫描操作
- limit限制返回条数
- 返回指定列
- 返回指定行键对应的数据
- 过滤器
- HBase中的过滤器
- 过滤器的用法
- 实例演示
- INCR
- 更多的操作
- Shell管理操作
- status
- whoami
- list
- count
- describe
- exists
- is_enabled、is_disabled
- alter
- disable/enable
- drop
- truncate
HBase数据模型
在HBASE中,数据存储在具有行和列的表中。这是看起来关系数据库(RDBMS)一样,但将HBASE表看成是多个维度的Map结构更容易理解。
表
- HBase中数据都是以表形式来组织的
- HBase中的表由多个行组成
在HBase WebUI(http://node3:16010中可以查看到目前HBase中的表)
行
- HBASE中的行由一个rowkey(行键)和一个或多个列组成,列的值与rowkey、列相关联
- 行在存储时按行键按字典顺序排序
- 行键的设计非常重要,尽量让相关的行存储在一起
例如:存储网站域。如行键是域,则应该将域名反转后存储(org.apache.www、org.apache.mail、org.apache.jira)。这样,所有Apache域都在表中存储在一起,而不是根据子域的第一个字母展开。
列
- HBASE中的列由列蔟(Column Family)和列限定符(Column Qualifier)组成
- 表示如下:
- 列蔟名:列限定符名。
- 例如:C1:USER_ID、C1:SEX
- 列蔟名:列限定符名。
列蔟(Column Family):
- 出于性能原因,列蔟将一组列及其值组织在一起
- 每个列蔟都有一组存储属性,例如:
- 是否应该缓存在内存中
- 数据如何被压缩或行键如何编码等
- 表中的每一行都有相同的列蔟,但在列蔟中不存储任何内容
- 所有的列蔟的数据全部都存储在一块(文件系统HDFS)
- HBase官方建议所有的列蔟保持一样的列,并且将同一类的列放在一个列蔟中
列标识符(Column Qualifier):
- 列蔟中包含一个个的列限定符,这样可以为存储的数据提供索引
- 列蔟在创建表的时候是固定的,但列限定符是不作限制的
- 不同的行可能会存在不同的列标识符
单元格 (cell)
- 单元格是行、列系列和列限定符的组合
- 包含一个值和一个时间戳(表示该值的版本)
- 单元格中的内容是以二进制存储的
ROW | COLUMN+CELL |
---|---|
1250995 | column=C1:ADDRESS, timestamp=1588591604729, value=\xC9\xBD\xCE\xF7\xCA |
1250995 | column=C1:LATEST_DATE, timestamp=1588591604729, value=2019-03-28 |
1250995 | column=C1:NAME, timestamp=1588591604729, value=\xB7\xBD\xBA\xC6\xD0\xF9 |
1250995 | column=C1:NUM_CURRENT, timestamp=1588591604729, value=398.5 |
1250995 | column=C1:NUM_PREVIOUS, timestamp=1588591604729, value=379.5 |
1250995 | column=C1:NUM_USEAGE, timestamp=1588591604729, value=19 |
1250995 | column=C1:PAY_DATE, timestamp=1588591604729, value=2019-02-26 |
1250995 | column=C1:RECORD_DATE, timestamp=1588591604729, value=2019-02-11 |
1250995 | column=C1:SEX, timestamp=1588591604729, value=\xC5\xAE |
1250995 | column=C1:TOTAL_MONEY, timestamp=1588591604729, value=114 |
概念模型
Row Key | Time Stamp | ColumnFamily contents | ColumnFamily anchor | ColumnFamily people |
---|---|---|---|---|
“com.cnn.www” | t9 | anchor:cnnsi.com = “CNN” | ||
“com.cnn.www” | t8 | anchor:my.look.ca = “CNN.com” | ||
“com.cnn.www” | t6 | contents:html = “…” | ||
“com.cnn.www” | t5 | contents:html = “…” | ||
“com.cnn.www” | t3 | contents:html = “…” | ||
“com.example.www” | t5 | contents:html = “…” | people:author = “John Doe” |
- 上述表格有两行、三个列蔟(contens、ancho、people)
- “com.cnn.www”这一行anchor列蔟两个列(anchor:cssnsi.com、anchor:my.look.ca)、contents列蔟有个1个列(html)
- “com.cnn.www”在HBase中有 t3、t5、t6、t8、t9 5个版本的数据
- HBase中如果某一行的列被更新的,那么最新的数据会排在最前面,换句话说同一个rowkey的数据是按照倒序排序的
shell命令行进行CRUD操作
表的CRUD
我们可以以shell的方式来维护和管理HBase。例如:执行建表语句、执行增删改查操作等等。
HBase的shell其实是JRuby的IRB(交互式的Ruby),但在其中添加了一些HBase的命令。
- 启动Hbase shell
hbase shell
- 创建表
- 语法:
create '表名','列蔟名'...
- 语法:
# 创建订单表,表名为ORDER_INFO,该表有一个列蔟为C1
create 'ORDER_INFO','C1'
注意:
- create要写成小写
- 一个表可以包含若干个列蔟
- 命令解析:调用hbase提供的ruby脚本的create方法,传递两个字符串参数
- 通过下面链接可以看到每个命令都是一个ruby脚本: https://github.com/apache/hbase/tree/branch-2.1/hbase-shell/src/main/ruby/shell/commands
HBase是没有schema的,就是在创建表的时候无需指定表中有哪些列,只需要指定有多少个列族
- 查看表
list
- 删除表 (要删除某个表,必须要先禁用表)
- 禁用表
- 语法:disable “表名”
- 删除表
- 语法:drop “表名”
- 禁用表
#删除ORDER_INFO表
disable "ORDER_INFO"
drop "ORDER_INFO"
详细解释:
-
disable "ORDER_INFO"
命令用于禁用指定表。当表被禁用后,该表上的所有操作都将无法执行,包括读取和写入数据。执行该命令后,可以使用is_disabled "ORDER_INFO"
命令来确认表是否已经禁用。禁用表的目的是为了在删除表之前先停止对该表的所有操作,以避免数据的丢失。 -
drop "ORDER_INFO"
命令用于彻底删除指定的表及其所有数据。执行该命令前,需要先使用disable "ORDER_INFO"
命令将该表禁用。执行该命令后,HBase将删除该表的所有数据和元数据,并将该表从集群中移除。需要注意的是,该命令执行后,将无法恢复已删除的数据,因此在执行该命令之前,请确保您已经备份了所有重要的数据。
数据的CRUD
- PUT
- HBase中的put命令,可以用来将数据保存到表中。但
- put一次只能保存一个列的值。
- 以下是put的语法结构:
put '表名','ROWKEY','列蔟名:列名','值'
也就是说一次只能put一个单元格的值
put 'ORDER_INFO','000001','C1:ID','000001'
put 'ORDER_INFO','000001','C1:STATUS','已提交'
put 'ORDER_INFO','000001','C1:PAY_MONEY',4070
put 'ORDER_INFO','000001','C1:PAYWAY',1
put 'ORDER_INFO','000001','C1:USER_ID',4944191
put 'ORDER_INFO','000001','C1:OPERATION_DATE','2020-04-25 12:09:16'
put 'ORDER_INFO','000001','C1:CATEGORY','手机;'
- GET
- 在HBase中,可以使用get命令来获取单独的一行数据。
- 语法:
get '表名','rowkey'
get 'ORDER_INFO','000001'
- 显示中文
- 在HBase shell中,如果在数据中出现了一些中文,默认HBase shell中显示出来的是十六进制编码。
- 要想将这些编码显示为中文,我们需要在get命令后添加一个属性:
{FORMATTER => 'toString'}
get 'ORDER_INFO', '000001', {FORMATTER => 'toString'}
注:
- { key => value},这个是Ruby语法,表示定义一个HASH结构
- get是一个HBase Ruby方法,’ORDER_INFO’、’000001’、{FORMATTER => ‘toString’}是put方法的三个参数
- FORMATTER要使用大写
- 在Ruby中用{}表示一个字典,类似于hashtable,FORMATTER表示key、’toString’表示值
- PUT
- 同样,在HBase中,也是使用put命令来进行数据的更新,语法与之前的添加数据一模一样。
put 'ORDER_INFO', '000001', 'C1:STATUS', '已付款'
注意:
- HBase中会自动维护数据的版本
- 每当执行一次put后,都会重新生成新的时间戳
- DELETE
- 在HBase中,可以使用delete命令来将一个单元格的数据删除。
- 语法格式如下:
delete '表名', 'rowkey', '列蔟:列'。
注意:此处HBase默认会保存多个时间戳的版本数据,所以这里的delete删除的是最新版本的列数据。
- 删除指定的列
delete 'ORDER_INFO','000001','C1:STATUS'
- 删除整行数据
- deleteall命令
- deleteall命令可以将指定rowkey对应的所有列全部删除。
- 语法:
deleteall '表名','rowkey'
- deleteall命令
deleteall 'ORDER_INFO','000001'
- HBase删除一个列的数据,可能会存在一定的延时,因为一些系统的卡顿,执行写入,读取是非常快的
- 删除数据的时候,其实HBase不是真正把数据删除掉,而是给某个列设置一个标记,然后查询数据的时候,有这个标志的数据,就不显示出来
- 后台存在进程,专门来执行删除数据的操作
- 执行delete的时候
- 如果表中某个列经过了几次修改,那么会删除最近一次修改
- 默认是保存三个最近修改的版本(version),版本使用时间戳表示
- 清空表
- truncate命令
- truncate命令用来清空某个表中的所有数据。
- 语法:
truncate "表名"
- truncate命令
truncate 'ORDER_INFO'
数据批量导入
我们有一份这样的HBase数据集,我们需要将这些指令放到HBase中执行,将数据导入到HBase中。
可以看到这些都是一堆的put语句。那么如何才能将这些语句全部执行呢?
- 将该数据集文件上传到指定的目录中
- 使用以下命令执行:
hbase shell /export/software/ORDER_INFO.txt
计数操作
查看HBase中的ORDER_INFO表,一共有多少条记录。
count命令专门用来统计一个表中有多少条数据。
- 语法:
count ‘表名’
注意:这个操作是比较耗时的。在数据量大的这个命令可能会运行很久。
- 获取订单数据
count 'ORDER_INFO'
大量数据的计数统计
当HBase中数据量大时,可以使用HBase中提供的MapReduce程序来进行计数统计。
- 语法如下:
$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter '表名'
具体步骤:
- 启动YARN集群
启动yarn集群
start-yarn.sh
启动history server
mr-jobhistory-daemon.sh start historyserver
- 执行MR JOB
$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'ORDER_INFO'
通过观察YARN的WEB UI,我们发现HBase启动了一个名字为rowcounter_ORDER_INFO的作业。
扫描操作
- scan命令
- 在HBase,我们可以使用scan命令来扫描HBase中的表。
- 语法:
scan '表名'
# {FORMATTER => 'toString'} 是一个可选参数,它指定了输出格式化器为 toString,该格式化器会将所有结果以字符串形式输出。
scan 'ORDER_INFO',{FORMATTER => 'toString'}
scan 命令用于扫描表,并将满足条件的行或列族返回。可以通过一些参数来指定扫描的范围、过滤条件、返回的列等。
例如:
scan 'ORDER_INFO'
:扫描ORDER_INFO
表中的所有行。scan 'ORDER_INFO', {STARTROW => '000001', ENDROW => '000010'}
:扫描ORDER_INFO
表中行键从000001 到 0- 00010
的所有行。scan 'ORDER_INFO', {COLUMNS => 'C1:col1'}
:扫描ORDER_INFO
表中C1
列族下col1
列的所有数据。scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'col1', =, 'binary:1000')"}
:扫描ORDER_INFO
表中C1
列族下col1
列的值为1000
的所有数据。
在上述命令中,可以通过设置 LIMIT 参数来限制返回的行数,也可以通过设置 TIMERANGE 参数来限制返回的时间范围,以实现更精细的扫描。
注意:要避免scan一张大表!原因如下:
- 造成过多的磁盘 I/O:HBase 中的数据存储在 HDFS 中,使用 scan 命令扫描一张大表会涉及到大量的磁盘 I/O 操作,这可能会导致过多的磁盘负载,影响整个集群的性能。
- 可能导致 RegionServer 宕机:当使用 scan 命令扫描一张大表时,HBase 会为该操作创建一个 Scanner,该 Scanner 会一直保持打开状态直到扫描结束。
- 如果扫描的数据量非常大,Scanner 将会持续存在很长时间,占用大量的内存资源,这可能会导致 RegionServer 宕机或者内存溢出等问题。
- 因此,为了避免这些问题,应该尽量避免使用 scan 命令扫描一张大表。
- 如果必须要扫描大表,可以考虑使用一些技术手段来降低对磁盘和内存资源的压力,比如设置扫描范围、限制返回的列等,以及使用 MapReduce 等技术来实现分布式扫描。
- 同时,还需要注意定期清理过期数据,以避免过多的数据积累导致扫描效率下降。
limit限制返回条数
- 限制只返回三条数据
scan 'ORDER_INFO', {LIMIT => 3, FORMATTER => 'toString'}
返回指定列
- 只查询订单状态以及支付方式,并且只展示3条数据
scan 'ORDER_INFO', {LIMIT => 3, COLUMNS => ['C1:STATUS', 'C1:PAYWAY'], FORMATTER => 'toString'}
注意:
[‘C1:STATUS’, …]
在Ruby中[]表示一个数组
返回指定行键对应的数据
- 根据ROWKEY来查询对应的数据,ROWKEY为02602f66-adc7-40d4-8485-76b5632b5b53,只查询订单状态、支付方式,并以中文展示
- 要查询指定ROWKEY的数据,需要使用ROWPREFIXFILTER,用法为:
scan '表名', {ROWPREFIXFILTER => 'rowkey'}
- 实现指令:
scan 'ORDER_INFO', {ROWPREFIXFILTER => '02602f66-adc7-40d4-8485-76b5632b5b53', COLUMNS => ['C1:STATUS', 'C1:PAYWAY'], FORMATTER => 'toString'}
过滤器
在HBase中,如果要对海量的数据来进行查询,此时基本的操作是比较无力的。此时,需要借助HBase中的高级语法Filter来进行查询。
Filter可以根据列簇、列、版本等条件来对数据进行过滤查询。因为在HBase中,主键、列、版本都是有序存储的,所以借助Filter,可以高效地完成查询。
当执行Filter时,HBase会将Filter分发给各个HBase服务器节点来进行查询。
HBase中的过滤器也是基于Java开发的,只不过在Shell中,我们是使用基于JRuby的语法来实现的交互式查询。
以下是HBase 2.2的JAVA API文档:
- http://hbase.apache.org/2.2/devapidocs/index.html
HBase中的过滤器
在HBase的shell中,通过show_filters指令,可以查看到HBase中内置的一些过滤器。
hbase(main):028:0> show_filters
DependentColumnFilter
KeyOnlyFilter
ColumnCountGetFilter
SingleColumnValueFilter
PrefixFilter
SingleColumnValueExcludeFilter
FirstKeyOnlyFilter
ColumnRangeFilter
ColumnValueFilter
TimestampsFilter
FamilyFilter
QualifierFilter
ColumnPrefixFilter
RowFilter
MultipleColumnPrefixFilter
InclusiveStopFilter
PageFilter
ValueFilter
ColumnPaginationFilter
rowkey 过滤器 | RowFilter | 实现行键字符串的比较和过滤 |
---|---|---|
PrefixFilter | rowkey前缀过滤器 | |
KeyOnlyFilter | 只对单元格的键进行过滤和显示,不显示值 | |
FirstKeyOnlyFilter | 只扫描显示相同键的第一个单元格,其键值对会显示出来 | |
InclusiveStopFilter | 替代 ENDROW 返回终止条件行 | |
列过滤器 | FamilyFilter | 列簇过滤器 |
QualifierFilter | 列标识过滤器,只显示对应列名的数据 | |
ColumnPrefixFilter | 对列名称的前缀进行过滤 | |
MultipleColumnPrefixFilter | 可以指定多个前缀对列名称过滤 | |
ColumnRangeFilter | 过滤列名称的范围 | |
值过滤器 | ValueFilter | 值过滤器,找到符合值条件的键值对 |
SingleColumnValueFilter | 在指定的列蔟和列中进行比较的值过滤器 | |
SingleColumnValueExcludeFilter | 排除匹配成功的值 | |
其他过滤器 | ColumnPaginationFilter | 对一行的所有列分页,只返回 [offset,offset+limit] 范围内的列 |
PageFilter | 对显示结果按行进行分页显示 | |
TimestampsFilter | 时间戳过滤,支持等值,可以设置多个时间戳 | |
ColumnCountGetFilter | 限制每个逻辑行返回键值对的个数,在 get 方法中使用 | |
DependentColumnFilter | 允许用户指定一个参考列或引用列来过滤其他列的过滤器 |
Java API官方地址:https://hbase.apache.org/devapidocs/index.html
过滤器的用法
过滤器一般结合scan命令来使用。打开HBase的JAVA API文档。找到RowFilter的构造器说明,我们来看以下,HBase的过滤器该如何使用。
scan '表名', { Filter => "过滤器(比较运算符, '比较器表达式')” }
- 比较运算符
比较运算符 | 描述 |
---|---|
= | 等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 不等于 |
- 比较器
比较器 | 描述 |
---|---|
BinaryComparator | 匹配完整字节数组 |
BinaryPrefixComparator | 匹配字节数组前缀 |
BitComparator | 匹配比特位 |
NullComparator | 匹配空值 |
RegexStringComparator | 匹配正则表达式 |
SubstringComparator | 匹配子字符串 |
- 比较器表达式
基本语法:比较器类型:比较器的值
比较器 | 表达式语言缩写 |
---|---|
BinaryComparator | binary:值 |
BinaryPrefixComparator | binaryprefix:值 |
BitComparator | bit:值 |
NullComparator | null |
RegexStringComparator | regexstring:正则表达式 |
SubstringComparator | substring:值 |
实例演示
- 使用RowFilter查询指定订单ID的数据
- 只查询订单的ID为:02602f66-adc7-40d4-8485-76b5632b5b53、订单状态以及支付方式
分析
- 因为要订单ID就是ORDER_INFO表的rowkey,所以,我们应该使用rowkey过滤器来过滤
- 通过HBase的JAVA API,找到RowFilter构造器
通过上图,可以分析得到,RowFilter过滤器接受两个参数,
- op——比较运算符
- rowComparator——比较器
所以构建该Filter的时候,只需要传入两个参数即可
scan 'ORDER_INFO', {FILTER => "RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')"}
- 查询状态为已付款的订单
分析
-
因为此处要指定列来进行查询,所以,我们不再使用rowkey过滤器,而是要使用列过滤器
-
我们要针对指定列和指定值进行过滤,比较适合使用SingleColumnValueFilter过滤器,查看JAVA API
需要传入四个参数:
- 列簇
- 列标识(列名)
- 比较运算符
- 比较器
注意:
- 列名STATUS的大小写一定要对!此处使用的是大写!
- 列名写错了查不出来数据,但HBase不会报错,因为HBase是无模式的
HBase是无模式的,不会检查或验证列族或列名是否存在或拼写是否正确。如果列族或列名拼写错误,HBase不会报错,但是查询不会返回数据。因此,需要非常小心地输入列族和列名,并且在查询之前应该先验证它们是否正确。可以通过使用HBase Shell或HBase API来验证列族和列名是否正确。
scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'STATUS', =, 'binary:已付款')", FORMATTER => 'toString'}
- 查询支付方式为1,且金额大于3000的订单
分析
-
此处需要使用多个过滤器共同来实现查询,多个过滤器,可以使用AND或者OR来组合多个过滤器完成查询
-
使用SingleColumnValueFilter实现对应列的查询
- 查询支付方式为1
SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1')
- 查询金额大于3000的订单
SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')
- 组合查询
scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')", FORMATTER => 'toString'}
注意:
- HBase shell中比较默认都是字符串比较,所以如果是比较数值类型的,会出现不准确的情况
- 例如:在字符串比较中4000是比100000大的
HBase shell默认将所有输入都视为字符串类型,因此在比较数值类型时可能会出现问题。例如,将两个整数进行比较,它们将按字典序进行比较,而不是数值大小。这可能会导致不准确的结果。要避免这种情况,可以使用HBase shell提供的类型转换函数,例如toInt和toFloat,将字符串转换为相应的数值类型,以进行正确的比较。
INCR
- 需求
- 某新闻APP应用为了统计每个新闻的每隔一段时间的访问次数,他们将这些数据保存在HBase中。
该表格数据如下所示:
新闻ID | 访问次数 | 时间段 | ROWKEY |
---|---|---|---|
0000000001 | 12 | 00:00-01:00 | 0000000001_00:00-01:00 |
0000000002 | 12 | 01:00-02:00 | 0000000002_01:00-02:00 |
要求:原子性增加新闻的访问次数值。
- incr操作简介
- incr可以实现对某个单元格的值进行原子性计数。
- 语法如下:
- incr ‘表名’,‘rowkey’,‘列蔟:列名’,累加值(默认累加1)
注意:
-
如果某一列要实现计数功能,必须要使用incr来创建对应的列
-
使用put创建的列是不能实现累加的
导入测试数据:
# 创建表
create 'NEWS_VISIT_CNT', 'C1';
incr 'NEWS_VISIT_CNT','0000000001_00:00-01:00','C1:CNT',12
incr 'NEWS_VISIT_CNT','0000000002_01:00-02:00','C1:CNT',12
incr 'NEWS_VISIT_CNT','0000000003_02:00-03:00','C1:CNT',123
incr 'NEWS_VISIT_CNT','0000000004_00:00-01:00','C1:CNT',4
incr 'NEWS_VISIT_CNT','0000000005_01:00-02:00','C1:CNT',4
incr 'NEWS_VISIT_CNT','0000000006_02:00-03:00','C1:CNT',3
incr 'NEWS_VISIT_CNT','0000000007_01:00-02:00','C1:CNT',1
incr 'NEWS_VISIT_CNT','0000000008_02:00-03:00','C1:CNT',123
incr 'NEWS_VISIT_CNT','0000000009_00:00-01:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000010_01:00-02:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000011_00:00-01:00','C1:CNT',123
incr 'NEWS_VISIT_CNT','0000000012_01:00-02:00','C1:CNT',1
incr 'NEWS_VISIT_CNT','0000000013_02:00-03:00','C1:CNT',23
incr 'NEWS_VISIT_CNT','0000000014_01:00-02:00','C1:CNT',123
incr 'NEWS_VISIT_CNT','0000000015_02:00-03:00','C1:CNT',83
incr 'NEWS_VISIT_CNT','0000000016_00:00-01:00','C1:CNT',1
incr 'NEWS_VISIT_CNT','0000000017_01:00-02:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000018_01:00-02:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000019_02:00-03:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT',6
incr 'NEWS_VISIT_CNT','0000000021_02:00-03:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000022_00:00-01:00','C1:CNT',7
incr 'NEWS_VISIT_CNT','0000000023_01:00-02:00','C1:CNT',98
incr 'NEWS_VISIT_CNT','0000000024_00:00-01:00','C1:CNT',7
incr 'NEWS_VISIT_CNT','0000000025_01:00-02:00','C1:CNT',0
incr 'NEWS_VISIT_CNT','0000000026_02:00-03:00','C1:CNT',0
incr 'NEWS_VISIT_CNT','0000000027_01:00-02:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000028_02:00-03:00','C1:CNT',8
incr 'NEWS_VISIT_CNT','0000000029_01:00-02:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000030_02:00-03:00','C1:CNT',3
incr 'NEWS_VISIT_CNT','0000000031_00:00-01:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000032_01:00-02:00','C1:CNT',4
incr 'NEWS_VISIT_CNT','0000000033_02:00-03:00','C1:CNT',6
incr 'NEWS_VISIT_CNT','0000000034_01:00-02:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000035_02:00-03:00','C1:CNT',7
incr 'NEWS_VISIT_CNT','0000000036_00:00-01:00','C1:CNT',98
incr 'NEWS_VISIT_CNT','0000000037_01:00-02:00','C1:CNT',7
incr 'NEWS_VISIT_CNT','0000000038_00:00-01:00','C1:CNT',0
incr 'NEWS_VISIT_CNT','0000000039_01:00-02:00','C1:CNT',0
incr 'NEWS_VISIT_CNT','0000000040_02:00-03:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000041_01:00-02:00','C1:CNT',8
incr 'NEWS_VISIT_CNT','0000000042_02:00-03:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000043_00:00-01:00','C1:CNT',3
incr 'NEWS_VISIT_CNT','0000000044_01:00-02:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000045_01:00-02:00','C1:CNT',4
incr 'NEWS_VISIT_CNT','0000000046_02:00-03:00','C1:CNT',7
incr 'NEWS_VISIT_CNT','0000000047_01:00-02:00','C1:CNT',0
incr 'NEWS_VISIT_CNT','0000000048_02:00-03:00','C1:CNT',0
put 'NEWS_VISIT_CNT','0000000001_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000002_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000003_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000004_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000005_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000006_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000007_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000008_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000009_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000010_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000011_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000012_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000013_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000014_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000015_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000016_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000017_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000018_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000019_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000021_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000022_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000023_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000024_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000025_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000026_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000027_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000028_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000029_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000030_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000031_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000032_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000033_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000034_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000035_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000036_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000037_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000038_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000039_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000040_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000041_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000042_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000043_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000044_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000045_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000046_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000047_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000048_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
exit
该脚本创建了一个表,名为NEWS_VISIT_CNT,列蔟为C1。
并使用incr创建了若干个计数器,每个rowkey为:新闻的编号_时间段
。CNT为count的缩写,表示访问的次数。
- 导入测试数据
hbase shell /export/software/NEWS_VISIT_CNT.txt
scan 'NEWS_VISIT_CNT', {LIMIT => 5, FORMATTER => 'toString'}
需求: 对0000000020新闻01:00 - 02:00访问计数+1
- 获取0000000020这条新闻在01:00-02:00当前的访问次数
get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
此处,如果用get获取到的数据是这样的:
- 使用incr进行累加
incr 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
- 再次查询新闻当前的访问次数
get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
更多的操作
以下连接可以查看到所有HBase中支持的SHELL脚本。
- https://learnhbase.net/2013/03/02/hbase-shell-commands/
Shell管理操作
status
例如:显示服务器状态
whoami
显示HBase当前用户,例如:
list
显示当前所有的表
count
统计指定表的记录数,例如:
describe
展示表结构信息
exists
检查表是否存在,适用于表量特别多的情况
is_enabled、is_disabled
检查表是否启用或禁用
alter
该命令可以改变表和列蔟的模式,例如:
# 创建一个USER_INFO表,两个列蔟C1、C2
create 'USER_INFO', 'C1', 'C2'
# 新增列蔟C3
alter 'USER_INFO', 'C3'
# 删除列蔟C3
alter 'USER_INFO', 'delete' => 'C3'
注意:
- ‘delete’ => ‘C3’,还是一个Map结构,只不过只有一个key,可以省略两边的{}
disable/enable
禁用一张表/启用一张表
drop
删除一张表,记得在删除表之前必须先禁用
truncate
清空表的数据,禁用表-删除表-创建表