HBase教程™ (yiibai.com)
Overview (Apache HBase 3.0.0-alpha-2-SNAPSHOT API)
# 启动 HBase Shel
hbase shell
# 格式
HBase Master的ip:16010
# 示例
# 想要这样访问需要配置域名映射
node1:16010
① get 查询
get '表名','rowkey'
② scan 查询(完整的 rowkey 或者 rowkey 前缀)
scan '表名', {ROWPREFIXFILTER => 'rowkey'}
显示服务器的状态
status
whoami
显示当前的 NameSpace
list_namespace
# 注:hbase namespace 是 hbase 系统自带的默认 namespace
# 格式
create_namespace '名称'
# 示例:创建一个名称为 'dev' 的 NameSpace
create_namespace 'dev'
# 格式
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 '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 | 实现行键字符串的比较和过滤 |
---|---|---|
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 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
命令无法执行,一直在换行
命令中可能未加 ' '
结束符号,需要手动结束
>'
重新安装 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
进程还在不