前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hbase基础命令

Hbase基础命令

作者头像
Maynor
发布2021-04-09 15:30:22
1.7K0
发布2021-04-09 15:30:22
举报

文章目录

4. 常用shell操作

我们可以以shell的方式来维护和管理HBase。例如:执行建表语句、执行增删改查操作等等。 4.1 需求 有以下订单数据,我们想要将这样的一些数据保存到HBase中。 订单ID 订单状态 支付金额 支付方式ID 用户ID 操作时间 商品分类 001 已付款 200.5 1 001 2020-5-2 18:08:53 手机; 接下来,我们将使用HBase shell来进行以下操作: 1.创建表 2.添加数据 3.更新数据 4.删除数据 5.查询数据 4.2 创建表 在HBase中,所有的数据也都是保存在表中的。要将订单数据保存到HBase中,首先需要将表创建出来。 4.2.1 启动HBase Shell HBase的shell其实JRuby的IRB(交互式的Ruby),但在其中添加了一些HBase的命令。 启动HBase shell: hbase shell 4.2.2 创建表

代码语言:javascript
复制
语法:
create '表名','列蔟名'...

创建订单表,表名为ORDER_INFO,该表有一个列蔟为C1
create 'ORDER_INFO','C1';

注意: create要写成小写 一个表可以包含若干个列蔟 命令解析:调用hbase提供的ruby脚本的create方法,传递两个字符串参数 通过下面链接可以看到每个命令都是一个ruby脚本 链接 4.2.3 查看表

代码语言:javascript
复制
hbase(main):005:0> list
TABLE                                                                                                                                                                    
ORDER_INFO                                                                                                                                                               
1 row(s)
Took 0.0378 seconds                                                                                                                                                      
=> ["ORDER_INFO"]

4.2.4 删除表 要删除某个表,必须要先禁用表 4.2.4.1 禁用表

代码语言:javascript
复制
语法:disable "表名"

4.2.4.2 删除表

代码语言:javascript
复制
语法:drop "表名"

4.2.4.3 删除ORDER_INFO表

代码语言:javascript
复制
disable "ORDER_INFO"
drop "ORDER_INFO

" 4.3 添加数据 4.3.1 需求 接下来,我们需要往订单表中添加以下数据。

代码语言:javascript
复制
订单ID	订单状态	支付金额	支付方式ID	用户ID	操作时间	商品分类

ID	STATUS	PAY_MONEY	PAYWAY	USER_ID	OPERATION_DATE	CATEGORY
000001	已提交	4070	1	4944191	2020-04-25 12:09:16	手机;

4.3.2 PUT操作 HBase中的put命令,可以用来将数据保存到表中。但put一次只能保存一个列的值。以下是put的语法结构:

代码语言:javascript
复制
put '表名','ROWKEY','列蔟名:列名','值'

要添加以上的数据,需要使用7次put操作。如下:

代码语言:javascript
复制
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','手机;'

4.4 查看添加的数据 4.4.1 需求 要求将rowkey为:000001对应的数据查询出来。 4.4.2 get命令 在HBase中,可以使用get命令来获取单独的一行数据。

代码语言:javascript
复制
语法:
get '表名','rowkey'

4.4.3 查询指定订单ID的数据

代码语言:javascript
复制
get 'ORDER_INFO','000001'

COLUMN	CELL         
 C1:CATEGORY       	timestamp=1588415690678, value=\xE6\x89\x8B\xE6\x9C\xBA;             
 C1:OPERATION_DATE 	timestamp=1588415689773, value=2020-04-25 12:09:16                   
 C1:PAYWAY         	timestamp=1588415689681, value=1                                     
 C1:PAY_MONEY      	timestamp=1588415689643, value=4070                                  
 C1:STATUS         	timestamp=1588415689591, value=\xE5\xB7\xB2\xE6\x8F\x90\xE4\xBA\xA4  
 C1:USER_ID        	timestamp=1588415689721, value=4944191                               

4.4.4 显示中文 在HBase shell中,如果在数据中出现了一些中文,默认HBase shell中显示出来的是十六进制编码。要想将这些编码显示为中文,我们需要在get命令后添加一个属性:{FORMATTER => ‘toString’} 4.4.4.1 查看订单的数据

代码语言:javascript
复制
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’表示值 4.5 更新操作 4.5.1 需求 将订单ID为000001的状态,更改为「已付款」 4.5.2 使用put来更新数据 同样,在HBase中,也是使用put命令来进行数据的更新,语法与之前的添加数据一模一样。 4.5.3 更新指定的列

代码语言:javascript
复制
put 'ORDER_INFO', '000001', 'C1:STATUS', '已付款'

注意:  HBase中会自动维护数据的版本  每当执行一次put后,都会重新生成新的时间戳 C1:STATUS timestamp=1588748844082, value=已提交 C1:STATUS timestamp=1588748952074, value=已付款 C1:STATUS timestamp=1588748994244, value=已付款 4.6 删除操作 4.6.1 删除状态列数据 4.6.1.1 需求 将订单ID为000001的状态列删除。 4.6.1.2 delete命令 在HBase中,可以使用delete命令来将一个单元格的数据删除。语法格式如下:

代码语言:javascript
复制
delete '表名', 'rowkey', '列蔟:列'。

注意:此处HBase默认会保存多个时间戳的版本数据,所以这里的delete删除的是最新版本的列数据。 4.6.1.3 删除指定的列

代码语言:javascript
复制
delete 'ORDER_INFO','000001','C1:STATUS'

4.6.2 删除整行数据 4.6.2.1 需求 将订单ID为000001的信息全部删除(删除所有的列) 4.6.2.2 deleteall命令 deleteall命令可以将指定rowkey对应的所有列全部删除。语法:

代码语言:javascript
复制
deleteall '表名','rowkey'

4.6.2.3 删除指定的订单

代码语言:javascript
复制
deleteall 'ORDER_INFO','000001'

4.6.3 清空表 4.6.3.1 需求 将ORDER_INFO的数据全部删除 4.6.3.2 truncate命令 truncate命令用来清空某个表中的所有数据。语法:

代码语言:javascript
复制
truncate "表名"

4.6.3.3 清空ORDER_INFO的所有数据

代码语言:javascript
复制
truncate 'ORDER_INFO'

4.7 导入测试数据集 4.7.1 需求 在资料的 数据集/ ORDER_INFO.txt 中,有一份这样的HBase数据集,我们需要将这些指令放到HBase中执行,将数据导入到HBase中。

可以看到这些都是一堆的put语句。那么如何才能将这些语句全部执行呢?

4.7.2 执行command文件 4.7.2.1 上传command文件 将该数据集文件上传到指定的目录中 4.7.2.2 执行 使用以下命令执行:

代码语言:javascript
复制
hbase shell /export/software/ORDER_INFO.txt

即可。 4.8 计数操作 4.8.1 需求 查看HBase中的ORDER_INFO表,一共有多少条记录。 4.8.2 count命令 count命令专门用来统计一个表中有多少条数据。语法:

代码语言:javascript
复制
count ‘表名’

注意:这个操作是比较耗时的。在数据量大的这个命令可能会运行很久。 4.8.3 获取订单数据

代码语言:javascript
复制
 count 'ORDER_INFO'

4.9 大量数据的计数统计 当HBase中数据量大时,可以使用HBase中提供的MapReduce程序来进行计数统计。语法如下:

代码语言:javascript
复制
$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter '表名'

4.9.1 启动YARN集群 启动yarn集群

代码语言:javascript
复制
start-yarn.sh

启动history server

代码语言:javascript
复制
mr-jobhistory-daemon.sh start historyserver

4.9.2 执行MR JOB

代码语言:javascript
复制
$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'ORDER_INFO'

通过观察YARN的WEB UI,我们发现HBase启动了一个名字为rowcounter_ORDER_INFO的作业。

4.10 扫描操作 4.10.1 需求一:查询订单所有数据 4.10.1.1 需求 查看ORDER_INFO表中所有的数据 4.10.1.2 scan命令 在HBase,我们可以使用scan命令来扫描HBase中的表。语法:

代码语言:javascript
复制
scan '表名'

4.10.1.3 扫描ORDER_INFO表

代码语言:javascript
复制
scan 'ORDER_INFO',{FORMATTER => 'toString'}

注意:要避免scan一张大表! 4.10.2 需求二:查询订单数据(只显示3条)

代码语言:javascript
复制
scan 'ORDER_INFO', {LIMIT => 3, FORMATTER => 'toString'}

4.10.3 需求三:查询订单状态、支付方式 4.10.3.1 需求 只查询订单状态以及支付方式,并且只展示3条数据 4.10.3.2 命令

代码语言:javascript
复制
scan 'ORDER_INFO', {LIMIT => 3, COLUMNS => ['C1:STATUS', 'C1:PAYWAY'], FORMATTER => 'toString'}

注意: [‘C1:STATUS’, …]在Ruby中[]表示一个数组 4.10.4 需求四:查询指定订单ID的数据并以中文展示 根据ROWKEY来查询对应的数据,ROWKEY为02602f66-adc7-40d4-8485-76b5632b5b53,只查询订单状态、支付方式,并以中文展示。

要查询指定ROWKEY的数据,需要使用ROWPREFIXFILTER,用法为:

代码语言:javascript
复制
scan '表名', {ROWPREFIXFILTER => 'rowkey'}

实现指令:

代码语言:javascript
复制
scan 'ORDER_INFO', {ROWPREFIXFILTER => '02602f66-adc7-40d4-8485-76b5632b5b53', COLUMNS => ['C1:STATUS', 'C1:PAYWAY'], FORMATTER => 'toString'}

4.11 过滤器 4.11.1 简介 在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

4.11.2 HBase中的过滤器 在HBase的shell中,通过show_filters指令,可以查看到HBase中内置的一些过滤器。

代码语言:javascript
复制
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 4.11.3 过滤器的用法 过滤器一般结合scan命令来使用。打开HBase的JAVA API文档。找到RowFilter的构造器说明,我们来看以下,HBase的过滤器该如何使用。 scan ‘表名’, { Filter => "过滤器(比较运算符, ‘比较器表达式’)” } 4.11.3.1 比较运算符

代码语言:javascript
复制
比较运算符	描述
=	等于
>	大于
>=	大于等于
<	小于
<=	小于等于
!=	不等于

4.11.3.2 比较器 比较器 描述

代码语言:javascript
复制
BinaryComparator	匹配完整字节数组
BinaryPrefixComparator	匹配字节数组前缀
BitComparator	匹配比特位
NullComparator	匹配空值
RegexStringComparator	匹配正则表达式
SubstringComparator	匹配子字符串

4.11.3.3 比较器表达式 基本语法:比较器类型:比较器的值 比较器 表达式语言缩写

代码语言:javascript
复制
BinaryComparator	binary:值
BinaryPrefixComparator	binaryprefix:值
BitComparator	bit:值
NullComparator	null
RegexStringComparator	regexstring:正则表达式
SubstringComparator	substring:值

4.11.4 需求一:使用RowFilter查询指定订单ID的数据

代码语言:javascript
复制
4.11.4.1 需求
只查询订单的ID为:02602f66-adc7-40d4-8485-76b5632b5b53、订单状态以及支付方式   

分析
1.因为要订单ID就是ORDER_INFO表的rowkey,所以,我们应该使用rowkey过滤器来过滤
2.通过HBase的JAVA API,找到RowFilter构造器

通过上图,可以分析得到,RowFilter过滤器接受两个参数,
 op——比较运算符
 rowComparator——比较器
所以构建该Filter的时候,只需要传入两个参数即可

4.11.4.2 命令

代码语言:javascript
复制
scan 'ORDER_INFO', {FILTER => "RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')"}
4.11.5 需求二:查询状态为已付款的订单
4.11.5.1 需求
查询状态为「已付款」的订单

分析
1.因为此处要指定列来进行查询,所以,我们不再使用rowkey过滤器,而是要使用列过滤器
2.我们要针对指定列和指定值进行过滤,比较适合使用SingleColumnValueFilter过滤器,查看JAVA API

需要传入四个参数:
 列簇
 列标识(列名)
 比较运算符
 比较器

注意:
列名STATUS的大小写一定要对!此处使用的是大写!
列名写错了查不出来数据,但HBase不会报错,因为HBase是无模式的
4.11.5.2 命令
scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'STATUS', =, 'binary:已付款')", FORMATTER => 'toString'}

4.11.6 需求三:查询支付方式为1,且金额大于3000的订单

代码语言:javascript
复制
分析
 此处需要使用多个过滤器共同来实现查询,多个过滤器,可以使用AND或者OR来组合多个过滤器完成查询
 使用SingleColumnValueFilter实现对应列的查询
4.11.6.1 命令
1.查询支付方式为1
SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1')
2.查询金额大于3000的订单
SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')
3.组合查询
scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')", FORMATTER => 'toString'}

注意:
HBase shell中比较默认都是字符串比较,所以如果是比较数值类型的,会出现不准确的情况
例如:在字符串比较中4000是比100000大的
4.12 INCR
4.12.1 需求
某新闻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

要求:原子性增加新闻的访问次数值。
4.12.2 incr操作简介
incr可以实现对某个单元格的值进行原子性计数。语法如下:
incr '表名','rowkey','列蔟:列名',累加值(默认累加1)

 如果某一列要实现计数功能,必须要使用incr来创建对应的列
 使用put创建的列是不能实现累加的

4.12.3 导入测试数据

代码语言:javascript
复制
该脚本创建了一个表,名为NEWS_VISIT_CNT,列蔟为C1。并使用incr创建了若干个计数器,每个rowkey为:新闻的编号_时间段。CNT为count的缩写,表示访问的次数。

hbase shell /export/software/NEWS_VISIT_CNT.txt 
scan 'NEWS_VISIT_CNT', {LIMIT => 5, FORMATTER => 'toString'}
4.12.4 需求一:对0000000020新闻01:00 - 02:00访问计数+1
1.获取0000000020这条新闻在01:00-02:00当前的访问次数
get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
此处,如果用get获取到的数据是这样的:
base(main):029:0> get 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
COLUMN                                           CELL                                                                                                                                        
 C1:CNT                                          timestamp=1599529533072, value=\x00\x00\x00\x00\x00\x00\x00\x06                                                                             
1 row(s)
Took 0.0243 seconds

2.使用incr进行累加
incr 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'

3.再次查案新闻当前的访问次数
get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
4.13 更多的操作
以下连接可以查看到所有HBase中支持的SHELL脚本。
https://learnhbase.net/2013/03/02/hbase-shell-commands/

5. shell管理操作

代码语言:javascript
复制
5.1 status
例如:显示服务器状态
2.4.1 :062 > status
1 active master, 0 backup masters, 3 servers, 0 dead, 1.0000 average load
Took 0.0034 seconds     
5.2 whoami
显示HBase当前用户,例如:
2.4.1 :066 > whoami
root (auth:SIMPLE)
    groups: root
Took 0.0080 seconds
5.3 list
显示当前所有的表
2.4.1 :067 > list
TABLE                                                                                                                                                  
ORDER_INFO                                                                                                                                             
1 row(s)
Took 0.0266 seconds                                                                                                                                    
 => ["ORDER_INFO"]
5.4 count
统计指定表的记录数,例如:
2.4.1 :070 > count 'ORDER_INFO'
66 row(s)
Took 0.0404 seconds                                                                                                                                    
 => 66
5.5 describe
展示表结构信息
2.4.1 :074 > describe 'ORDER_INFO'
Table ORDER_INFO is ENABLED                                                                                                                            
ORDER_INFO                                                                                                                                             
COLUMN FAMILIES DESCRIPTION                                                                                                                            
{NAME => 'C1', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE =
> 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE =
> 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLO
CKSIZE => '65536'}                                                                                                                                     
1 row(s)
Took 0.0265 seconds        
5.6 exists
检查表是否存在,适用于表量特别多的情况
2.4.1 :075 > exists 'ORDER_INFO'
Table ORDER_INFO does exist                                                                                                                            
Took 0.0050 seconds                                                                                                                                    
 => true
5.7 is_enabled、is_disabled
检查表是否启用或禁用
2.4.1 :077 > is_enabled 'ORDER_INFO'
true                                                                                                                                                   
Took 0.0058 seconds                                                                                                                                    
 => true 
2.4.1 :078 > is_disabled 'ORDER_INFO'
false                                                                                                                                                  
Took 0.0085 seconds                                                                                                                                    
 => 1
5.8 alter
该命令可以改变表和列蔟的模式,例如:

创建一个USER_INFO表,两个列蔟C1、C2

代码语言:javascript
复制
create 'USER_INFO', 'C1', 'C2'

新增列蔟C3

代码语言:javascript
复制
alter 'USER_INFO', 'C3'

删除列蔟C3

代码语言:javascript
复制
alter 'USER_INFO', 'delete' => 'C3'
代码语言:javascript
复制
> 注意: 'delete' => 'C3',还是一个Map结构,只不过只有一个key,可以省略两边的{}
> 5.9 disable/enable 禁用一张表/启用一张表
> 5.10 drop 删除一张表,记得在删除表之前必须先禁用
> 5.11 truncate 清空表的数据,禁用表-删除表-创建表
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 4. 常用shell操作
  • 5. shell管理操作
相关产品与服务
TDSQL MySQL 版
TDSQL MySQL 版(TDSQL for MySQL)是腾讯打造的一款分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档