HBase 常用操作

HBase 常用操作

        • 启动/停止 HBase
        • 索引说明
        • 系统的操作
        • NameSpace 操作
        • 表的操作
        • 数据操作
        • 数据删除说明
        • 数据导入
        • 计数
        • Scan查询操作
        • 过滤器
        • INCR
        • 常见的错误

参考

HBase教程™ (yiibai.com)

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

启动/停止 HBase

# 启动 HBase Shel
hbase shell

HBase 常用操作_第1张图片
页面访问

# 格式
HBase Master的ip:16010

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

HBase 常用操作_第2张图片

索引说明

① get 查询

get '表名','rowkey'

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

scan '表名', {ROWPREFIXFILTER => 'rowkey'}

系统的操作

显示服务器的状态

status

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

whoami

在这里插入图片描述

NameSpace 操作

显示当前的 NameSpace

list_namespace

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

HBase 常用操作_第3张图片
创建 NameSpace

# 格式
create_namespace '名称'

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

HBase 常用操作_第4张图片
显示指定 NameSpace 下的表

# 格式
list_namespace_tables '名称'

HBase 常用操作_第5张图片

删除 NameSpace

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

# 示例
drop_namespace 'dev'

HBase 常用操作_第6张图片

表的操作

创建表

注意:创建表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}

HBase 常用操作_第7张图片

查看表

# 查看表
list

HBase 常用操作_第8张图片
查看表是否存在

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

# 示例
exists 'ORDER_INFO'

在这里插入图片描述

查看表结构

可以查看表的压缩算法

# 格式
describe '表名称'

# 示例
describe 'ORDER_INFO'

在这里插入图片描述

检查表是否启用或禁用

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

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

在这里插入图片描述

禁用/启用表

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

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

HBase 常用操作_第9张图片

修改表

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

# 创建一个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'

HBase 常用操作_第10张图片

删除表

注意:用 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 常用操作_第11张图片

显示为中文

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

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

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

HBase 常用操作_第12张图片

添加数据

# 格式: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 常用操作_第13张图片

删除指定的列值

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

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

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

HBase 常用操作_第14张图片
删除指定的行

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

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

# 示例
deleteall 'ORDER_INFO','000001'

HBase 常用操作_第15张图片

数据删除说明

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

HBase 常用操作_第16张图片

执行手动 flush

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

HBase 常用操作_第17张图片

执行合并 major_compact

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

HBase 常用操作_第18张图片

数据导入

执行HBase Shell 脚本

hbase shell /opt/server/ORDER_INFO.txt

HBase 常用操作_第19张图片
HBase 常用操作_第20张图片

计数

少量数据统计

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

# 格式
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'}

HBase 常用操作_第21张图片
只查询某几列数据

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

HBase 常用操作_第22张图片
查询指定的行

# 格式:
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'}

HBase 常用操作_第23张图片
查询多个版本的数据

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

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

HBase 常用操作_第24张图片
查询墓碑标记的数据

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

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

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

HBase 常用操作_第25张图片
查询指定前缀的行

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

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

HBase 常用操作_第26张图片
查询指定范围的行

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

使用格式

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

比较运算符

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

比较器

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

比较器 表达式语言缩写
BinaryComparator binary:值
BinaryPrefixComparator binaryprefix:值
BitComparator bit:值
NullComparator null
RegexStringComparator regexstring:正则表达式
SubstringComparator substring:值

使用 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'

常见的错误

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

>'

HBase 常用操作_第27张图片
Master is initializing

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

HBase 常用操作_第28张图片

# 进入 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 常用操作_第29张图片
解决方案:增加 HBase 的堆栈大小
HBase 常用操作_第30张图片

你可能感兴趣的:(HBase,hbase)