HBase 常用操作


参考

HBase教程™ (yiibai.com)

Overview (Apache HBase 3.0.0-alpha-2-SNAPSHOT API)

启动/停止 HBase
# 启动 HBase Shel
hbase shell

在这里插入图片描述
页面访问

# 格式
HBase Master的ip:16010

# 示例
# 想要这样访问需要配置域名映射
node1:16010

在这里插入图片描述

索引说明

① get 查询

get '表名','rowkey'

② scan 查询(完整的 rowkey 或者 rowkey 前缀)

scan '表名', {ROWPREFIXFILTER => 'rowkey'}
系统的操作

显示服务器的状态

status

在这里插入图片描述
显示HBase当前用户

whoami

在这里插入图片描述

NameSpace 操作

显示当前的 NameSpace

list_namespace

# 注:hbase namespace 是 hbase 系统自带的默认 namespace

在这里插入图片描述
创建 NameSpace

# 格式
create_namespace '名称'

# 示例:创建一个名称为 'dev' 的 NameSpace
create_namespace 'dev'

在这里插入图片描述
显示指定 NameSpace 下的表

# 格式
list_namespace_tables '名称'

在这里插入图片描述

删除 NameSpace

# 格式
# 只能删除空的 namespace , 如果有表则无法删除
drop_namespace '名称'

# 示例
drop_namespace 'dev'

在这里插入图片描述

表的操作

创建表

注意:创建表create 要写成小写,一个表可以包含若干个列蔟
版本是相对于列族而言的,不同的列族可以设置不同的版本

# 格式
create '表名称','列族';
# 格式:创建多个列族并指定多个版本
create '表名',{NAME='列族名1',VERSIONS=给定一个版本号},{NAME='列族名2',VERSIONS=给定的版本号}

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

# 示例:创建订单表,表名为ORDER_INFO,该表有两个列蔟为C1、C2
# 可以创建多个
create 'ORDER_INFO','C1','C2';

# 示例:在 dev 的 namespace 中创建一张表 t1 , 这张表有一个列族 C1 ,这个列族多有的列可以存储 5 个版本的值
# 缺省默认版本数量为 1
create 'dev:t1',{NAME => 'C1',VERSIONS =>5}

在这里插入图片描述

查看表

# 查看表
list

在这里插入图片描述
查看表是否存在

# 格式:检查表是否存在,适用于表量特别多的情况
exists '表名称'

# 示例
exists 'ORDER_INFO'

在这里插入图片描述

查看表结构

可以查看表的压缩算法

# 格式
describe '表名称'

# 示例
describe 'ORDER_INFO'

在这里插入图片描述

检查表是否启用或禁用

# 查看表是否启用
is_enabled 'ORDER_INFO'

# 查看表是否禁用
is_disabled 'ORDER_INFO'

在这里插入图片描述

禁用/启用表

# 格式:禁用表
disable '表名称';
# 格式:启用表
enable '表名称';

# 示例:禁用 emp 表
disable 'ORDER_INFO_TEMP';

在这里插入图片描述

修改表

该命令可以改变表和列族的模式

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

# 新增列蔟C3
alter 'USER_INFO', 'C3'

# 删除列蔟C3
alter 'USER_INFO', 'delete' => 'C3'

清除表中的数据

# 格式
truncate "表名"

# 示例:清空 ORDER_INFO 表中的数据
truncate 'ORDER_INFO_TEMP'

在这里插入图片描述

删除表

注意:用 drop 命令可以删除表。在删除一个表之前必须先将其禁用

# 格式
drop '表名';

# 示例:删除 emp 表
drop 'ORDER_INFO_TEMP';

在这里插入图片描述

数据操作

查询某个Rowkey的数据

注意:只能查询一行数据,且查询走索引

# 格式
get '表名','rowkey'
get	'命名空间:表名','行键值',[列族,列]
get 'ns:tbname','rowkey'
get 'ns:tbname','rowkey',[cf]
get 'ns:tbname','rowkey',[cf:col]

# 示例:将 rowkey 为 000001 对应的数据查询出来
get 'ORDER_INFO','000001'

# 示例:将 rowkey 为 000001 对应的数据的 CNT 字段查询出来
get 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'

在这里插入图片描述

显示为中文

注意:在 HBase shell 中,如果在数据中出现了一些中文,默认 HBase shell 中显示出来的是十六进制编码。要想将这些编码显示为中文,需要添加属性

# 格式
# FORMATTER 要使用大写
# {key => value},这个是 Ruby 语法,表示定义一个 HASH 结构
get '表名','rowkey', {FORMATTER => 'toString'}

# 示例
get 'ORDER_INFO','000001', {FORMATTER => 'toString'}

在这里插入图片描述

添加数据

# 格式:put一次只能保存一个列的值
put '表名','ROWKEY','列蔟名:列名','值'

# 添加数据
# 注意:这只是一行数据
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','手机;'

添加数据并指定时间戳

# 格式:put一次只能保存一个列的值
put '表名','ROWKEY','列蔟名:列名','值',时间戳

# 示例:添加数据,并指定时间戳为 1
put 'stu', '0001', 'info:address', "Beijing", 1

更新数据

注意:HBase 中会自动维护数据的版本,每当执行一次 put 后,都会重新生成新的时间戳

# 格式:put一次只能保存一个列的值
put '表名','ROWKEY','列蔟名:列名','值'

# 示例:将 000001 行的 STATUS 列的值修改为 已付款
put 'ORDER_INFO', '000001', 'C1:STATUS', '已付款'

在这里插入图片描述

删除指定的列值

HBase 中,可以使用 delete 命令来将一个单元格的数据删除,由于 HBASE 操作会保存多个时间戳版本的数据,所以 delete 将是最新版本

# 格式
delete '表名', 'rowkey', '列蔟:列'

# 示例:将 000001 行的 STATUS 列的值删除
delete 'ORDER_INFO','000001','C1:STATUS'

在这里插入图片描述
删除指定的行

deleteall 命令可以将指定 rowkey 对应的所有列全部删除

# 格式
deleteall '表名','rowkey'

# 示例
deleteall 'ORDER_INFO','000001'

在这里插入图片描述

数据删除说明

HBase 数据删除说明

① 删除一个列的指定版本

② 删除一个列的所有版本

③ 删除指定列族的所有列

注意

HBase 删除数据,并不是马上删掉,只是对数据打一个删除标记,真正删除数据是等到下一次 major_compact(除非KEEP_DELETED_CELLS=true )。当删除整行时,HBase 会给这条数据每个列族打一个删除标记

示例:当前有一张表

# 建表语句
create 'stu', {NAME => 'info', VERSIONS => 3}

# 插入数据
put 'stu', '0001', 'info:address', "address1", 1
put 'stu', '0001', 'info:address', "address1", 2
put 'stu', '0001', 'info:address', "address1", 3

查看所有版本的数据

scan 'stu', {RAW=>true, VERSIONS=>3}

在这里插入图片描述

删除 info 列的第二个版本

# 此时出现墓碑标记
delete 'stu', '0001', 'info:address', 2

在这里插入图片描述

执行手动 flush

# 墓碑标记被清除,数据版本被标记
flush 'stu'

在这里插入图片描述

执行合并 major_compact

# 被删除的版本彻底删除
major_compact 'stu'

在这里插入图片描述

数据导入

执行HBase Shell 脚本

hbase shell /opt/server/ORDER_INFO.txt

在这里插入图片描述
在这里插入图片描述

计数

少量数据统计

注意:数据量比较大的时候,耗时

# 格式
count '表名称'

# 示例:查询订单表的数量
count 'ORDER_INFO'

在这里插入图片描述

海量数据统计

# 使用HBase中提供的MapReduce程序来进行计数统计
$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter '表名'

# 示例
$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'ORDER_INFO'

在这里插入图片描述
在这里插入图片描述

Scan查询操作

扫描指定表中的数据

注意:不要扫描大表

# 格式
scan '表名'

# 示例:
scan 'ORDER_INFO',{FORMATTER => 'toString'}

在这里插入图片描述

LIMIT

# 只显示 3 条数据
scan 'ORDER_INFO', {LIMIT => 3, FORMATTER => 'toString'}

在这里插入图片描述
只查询某几列数据

# 只查询 STATUS 和 PAYWAY 字段的数据
scan 'ORDER_INFO', {LIMIT => 3, COLUMNS => ['C1:STATUS', 'C1:PAYWAY'], FORMATTER => 'toString'}

在这里插入图片描述
查询指定的行

# 格式:
scan '表名', {ROWPREFIXFILTER => 'rowkey'}

# 示例:查询 '02602f66-adc7-40d4-8485-76b5632b5b53' 行的数据,只显示 STATUS 和 PAYWAY 字段的数据
scan 'ORDER_INFO', {ROWPREFIXFILTER => '02602f66-adc7-40d4-8485-76b5632b5b53', COLUMNS => ['C1:STATUS', 'C1:PAYWAY'], FORMATTER => 'toString'}

在这里插入图片描述
查询多个版本的数据

# 格式:查询多少个版本的数据
# 如果想要查看多个版本的数据,在建表的时候必须指定多版本
# scan 默认是只查看最新版本的数据
scan '表名称', {VERSIONS=>要查看的版本数量}

# 示例:查询 3 个版本的数据,行键为 0001
scan 'stu', {ROWPREFIXFILTER=>'0001',VERSIONS=>3}

在这里插入图片描述
查询墓碑标记的数据

注:所谓墓碑标记的数据指的是,当多版本的表删除了某个版本的字段数据后,如果 HDFS 文件没有合并,删除的记录仍然存在,被打上墓碑标记的记录在HFile合并时才会被真正的删除

# 格式:查询多少个版本的数据,只有 RAW=true才能看到墓碑数据
scan '表名称', {RAW=>true, VERSIONS=>要查看的版本数量}

# 示例:查询 3 个版本的数据,行键为 0001
scan 'stu', {RAW=>true, VERSIONS=>3}

在这里插入图片描述
查询指定前缀的行

# 格式:该前缀只能是 ROWKEY 的前缀,其它列的前缀没效果
scan '表名', {ROWPREFIXFILTER => '前缀'}

# 示例:查询 '02602f66-adc7' 行的数据,只显示 STATUS 和 PAYWAY 字段的数据
scan 'ORDER_INFO', {ROWPREFIXFILTER => '02602f66-adc7',FORMATTER => 'toString'}

在这里插入图片描述
查询指定范围的行

# 格式:
# STARTROW:从某个rowkey开始,包含,闭区间
# STOPROW:到某个rowkey结束,不包含,开区间
scan '表名称',{STARTROW=>'范围开始',STOPROW=>'范围结束'}

# 示例:
scan 'default:ORDER_INFO',{STARTROW=>'20210101_000',STOPROW=>'20210101_007'}
过滤器

说明

在 HBase 中,如果要对海量的数据来进行查询,此时基本的操作是比较无力的。此时,需要借助 HBase 中的高级语法 ——Filter 来进行查询。Filter可以根据列簇、列、版本等条件来对数据进行过滤查询。因为在 HBase 中,主键、列、版本都是有序存储的,所以借助Filter,可以高效地完成查询。当执行 Filter 时,HBase 会将 Filte r分发给各个 HBase 服务器节点来进行查询

HBase 中的过滤器也是基于 Java 开发的,只不过在 Shell 中,我们是使用基于 JRuby 的语法来实现的交互式查询

常用的过滤器

rowkey 过滤器RowFilter实现行键字符串的比较和过滤
PrefixFilterrowkey前缀过滤器
KeyOnlyFilter只对单元格的键进行过滤和显示,不显示值
FirstKeyOnlyFilter只扫描显示相同键的第一个单元格,其键值对会显示出来
InclusiveStopFilter替代 ENDROW 返回终止条件行
列过滤器FamilyFilter列簇过滤器
QualifierFilter列标识过滤器,只显示对应列名的数据
ColumnPrefixFilter对列名称的前缀进行过滤
MultipleColumnPrefixFilter可以指定多个前缀对列名称过滤
ColumnRangeFilter过滤列名称的范围
值过滤器ValueFilter值过滤器,找到符合值条件的键值对
SingleColumnValueFilter在指定的列族和列中进行比较的值过滤器
SingleColumnValueExcludeFilter排除匹配成功的值
其他过滤器ColumnPaginationFilter对一行的所有列分页,只返回 [offset,offset+limit] 范围内的列
PageFilter对显示结果按行进行分页显示
TimestampsFilter时间戳过滤,支持等值,可以设置多个时间戳
ColumnCountGetFilter限制每个逻辑行返回键值对的个数,在 get 方法中使用
DependentColumnFilter允许用户指定一个参考列或引用列来过滤其他列的过滤器

使用格式

# 格式
scan '表名', { Filter => "过滤器(比较运算符, '比较器表达式')" }

比较运算符

比较运算符描述
=等于
>大于
>=大于等于
<小于
<=小于等于
!=不等于

比较器

基本语法:比较器类型:比较器的值

比较器表达式语言缩写
BinaryComparatorbinary:值
BinaryPrefixComparatorbinaryprefix:值
BitComparatorbit:值
NullComparatornull
RegexStringComparatorregexstring:正则表达式
SubstringComparatorsubstring:值

使用 RowFilter 查询指定订单 ID 的数据

scan 'ORDER_INFO', {FILTER => "RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')"}

查询状态为「已付款」的订单

scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'STATUS', =, 'binary:已付款')", FORMATTER => 'toString'}

查询支付方式为1,且金额大于3000的订单

# 查询支付方式为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'}
INCR
# 对指定的字段进行累加操作
incr 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
常见的错误

命令无法执行,一直在换行
命令中可能未加 ' ' 结束符号,需要手动结束

>'

在这里插入图片描述
Master is initializing

重新安装 hbase 后,旧的元数据信息没有删除,使用 zookeeper 删除 hbase 元数据后重启 hbase即可

在这里插入图片描述

# 进入 zookeeper 的安装目录
/opt/cloudera/parcels/CDH-6.2.1-1.cdh6.2.1.p0.1425774/lib/zookeeper/bin

# 进入 zookeeper 的命令行模式
./zkCli.sh

# 删除服务
rmr /hbase/meta-region-server

# 推出并重启 hbase
quit

region(s) in Transition for more tan … milliseconds

在执行 Region Split 时,因为系统中断(程序崩溃)或者 HDFS 中的 Region 文件已经被删除,先看下 HBase 进程还在不

在这里插入图片描述
解决方案:增加 HBase 的堆栈大小
在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HBase是一个基于Hadoop的分布式数据库,常用于存储大数据量及高并发的应用场景。下面是HBase常用命令及使用方法的简要介绍: 1. 创建表:create 'table_name', 'column_family' 创建一个名为table_name的表,指定列族为column_family。 2. 查看表:list 列出所有已创建的表。 3. 插入数据:put 'table_name', 'row_key', 'column_family:column', 'value' 插入数据到指定的表和行,指定列族、列和值。 4. 获取单行数据:get 'table_name', 'row_key' 获取指定表和行的数据。 5. 获取整表数据:scan 'table_name' 扫描并获取整张表的数据。 6. 删除数据:delete 'table_name', 'row_key', 'column_family:column' 删除指定表、行、列族下的数据。 7. 删除表:disable 'table_name' drop 'table_name' 禁用并删除指定的表。 8. 增加、修改列族:alter 'table_name', {NAME => 'column_family', VERSIONS => 'n'} 增加或修改指定表的列族,指定VERSIONS参数可以设置列的版本数量。 9. 启用或禁用表:enable 'table_name' disable 'table_name' 启用或禁用指定的表。 10. 设置表的最大版本数:alter 'table_name', {NAME => 'column_family', VERSIONS => 'n'} 设置指定表的列族的最大版本数。 11. 备份和恢复数据:snapshot 'snapshot_name', 'table_name' restore 'snapshot_name' 创建指定表的快照,并可以使用快照进行数据恢复。 通过使用这些常用命令,可以方便地管理HBase数据库,并进行数据的增删改查操作。需要注意的是,HBase是一个分布式数据库,涉及到多个节点的数据存储和处理,因此在进行操作时需要考虑数据一致性和分布式处理的特点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值