分享好友

×
取消 复制
HBASE的shell操作
2020-05-12 16:13:45

前言

我们知道hbase其实是架构在hdfs上的一个分布式数据库,既然是数据库那么这篇文章就主要围绕着我们最熟悉的增删改查来做。当然了,其实hbase的shell操作在真实的企业中几乎不用,这个很简单,我们的hbase是用来存贮海量数据的,还用shell来操作,疯了吗?比如一个查询,可能shell界面会一直被刷,那么我为啥还会写这篇文章呢?其实主要是记录,最重要的是通过他的shell操作能够更好的理解他的存贮本质以及他的架构,也能够为后面写API操作打下基础。

在具体开始介绍之前,需要先了解一个东西,那就是hbase采用是nosql语言,也就是和我们熟悉的mysql的语法差距有点大,好了,let's do it!

本文的命令不是重点:重点是知识点,都是知识点呀,同志们!

进入hbase客户端

第一个命令就是要进入hbase的客户端,直接敲击

hbase shell

help

接下来就要认识一个神级命令,没错,就是这个help,依稀记得小时候的那个学习机,哪里不会点哪里,有没有一起的同年记忆呀,暴露年龄了,不重要,hbase的help命令也是如此,你可以忘记所有的命令,但是这个命令一定要记住,哪里不会就哪里help就行了。

创建

有了这些前提,就让我们开始今天第一个创建命令,也就是所谓的增。

再说这个之前,先来普及一下知识点。认识一下什么叫做namespace。

我们想一想mysql,是不是有数据库呀?是的,hbase的namespace就是相当于mysql的数据库,数据库下面会可以创建表,hbase默认会有两个命名空间,分别为default和hbase。其中hbase这个命名空间是保存meta的,也就是元数据的,我们就不操作这个了。另外一个defalut在我们创建表的时候不指定的情况下,所有创建的表就会归类为这个命名空间,或者用熟悉的语言就是归类在这个数据库里面了。

好,就让我们先来直观体验一下吧,先来看看默认的两个命名空间,执行命令:

list_namespace

可以看到两个。

那你说我可以创建命名空间吗?我不想使用默认的default命名空间,当然可以了。

命令为:

create_namespace

这个时候,就懵逼了,知道了这个又能干啥,接下来就引入本文的重点了,另外一个神级操作,我现在知道这个是创建命名空间的,或者我根本不知道这个命令是干啥的,那么就直接敲击,放心,不会坏的,让我们看看发生了什么?

是不是超级棒,是的,不但给出了这个命令是干啥的,还给出了example例子,简直不要太爽啊,那我们就照着example敲击一下吧。

create_namespace 'ns1'

然后我们再来看一下现在的namespace列表

发现多了一个ns1命名空间,实际上在我们使用过程中,default命名空间就够了,这里是为了演示来创建一下的。

现在好了,我们有了命名空间了,就可以创建表了,在创建表之前,同样我们需要了解一个东西,那就是column family,有的把这个翻译为列族,有的翻译为列簇,其实都是一个意思,字面意思就是列的家族,是的,我认为翻译列族更加合适。这个有啥用吗?有的,hbase存贮数据是列式存贮的,如果你不懂什么叫列式存贮,请阅读我的另外一篇文章

栋公子:列式数据库和行式数据库的区别zhuanlan.zhihu.com图标

既然是列式存贮,我们就把很多相同的列的集合成为列族,在hbase中必须要创建列族,我们知道mysql中需要创建字段,hbase中完全不需要如此,只需要创建一个表名字,然后告诉这个表需要有几个列族即可,剩下的字段完全可以在插入的时候指定,可是说涉及到字段这个节点上来说完全没有任何规律可言,也不需要任何规律,OK,来创建一张表先。

创建语法:

create

再来说一下,create这个创建语法不会咋样?直接输入回车。就会看到下面这个提示,后面的演示就不再提示了。

可以看到,例子非常详尽,那就按照他的例子,来创建一个t1吧,还记得列族不,必须要指定列族,然后列族给他两个,分别为f1,f2

create 't2','f1','f2' # 第一种创建语法
create 't1',{NAME=>'f1'},{NAME=>'f2'} #第二种创建语法

实际上列族不宜创建过多,最好不好要超过两个,因为在hdfs上的底层,每一个列族就是一个文件,如果列族过多,则需要查询的文件也很多,影响查询的性能。

接下来看另外一个知识点,都是知识点啊,要动脑筋记住呀!那就是versions版本。是的,hbase有一个很大的特点,那就是可以存贮多个版本,想象我们的mysql,同一行的数据,如果想要将原本的数字1改成数字2,这个时候最常做的事情就是更新,但是在hdfs中就不一样了,这个数字1和数字2可以同时存在,对的,这个就是版本。我们在创建表的时候还可以指定版本,版本最大为5,如果不指定则为1,下面是一个创建的例子。

create 't3', {NAME => 'f1', VERSIONS => '3'},{NAME => 'f2'}

对的,写上VERSIONS 然后指定一下就好了。

关于版本这里还有个小东西需要理解,比如我们指定了版本为3,那这下子来了5个内容咋办,最开始的两条记录就会被删除了,只保留最后的3条记录。

再来一个知识点,认识一下TTL,这个是超时时间,怎么说呢?比如创建了一个列族,然后指定了超时时间为200秒,是的,这个TTL的单位是秒,然后这个时候插入1条记录,然后过100s再插入一段时间,然后再过100s,第一次插入的记录就消失了,这个TTL的作用范围是每个Cell,不是整个表第一次创建的时间,这一点尤其重要。

另外,这个TTL在不指定的前提下,会显示forever,也就是永久,如果真的追究起来,他也是有一个值的,为2147483647 大约69.04年,这么些年,也就相当于永久了,如果说你的内容要存100年,那。。。

创建语法:

create 't1', {NAME => 'f1', TTL => 200}

比如上面,我就写了200s,也就是每个cell过200s就消失了。温馨提示,如果你的数据没有这种业务,最好不要设置哟。

好了,还有一个小的知识点,那就是在特定的namespace下创建表

语法:

create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}

这个例子就是在ns1的namespace下面创建t1表,然后列族为f1,版本信息为5.

关于创建的时候,还可以进行预分区,不过这个知识点我留到我的下篇文章去全面介绍hbase的架构的时候来介绍,那个时候会说明的更明白一些。

添加数据

上面说完了创建,接下来让我们向表中添加数据。

语法:

put

这里还要普及一个知识点,那就是rowkey,翻译为行键,一个rowkey就是一行的唯一ID

并且在整个列族内唯一,记住唯一不是整个表,而是列族,因为一张表中可以有多个列族,后期我还会写如何优雅的设计rowkey,这个在很多面试题中也经常被问到,可以说一个优雅的设计是非常重要的。我们这里是演示,就随便指定就好了。

添加第一条数据:

put 't1','rk0001','f1:name','wang'

意思是向t1表中添加rowkey为rk001,列族为f1中添加name字段的值wang。

其中name这个字段不单单理解为name,你可以在这里指定任何你想要的字段,包括空也是一个字段,再来一个例子。

put 't1','rk0001','f2:age','10'

向t1表中插入rowkey为rk0001,列族为f2,字段为age,value为10

查询

上面向表中插入了数据,那这些数据到底在哪里呢?我们去查询一下。

语法

get

例子:

1.获取t1表中rowkey为rk0001的所有信息

get 't1','rk0001'

2.获取t1表中rowkey为rk0001,列族为f1的所有信息

get 't1','rk0001','f1'

3.查看t1表中rowkey为rk0001,列族为f1,字段为name的内容

get 't1','rk0001','f1:name'

4.查看t1表中rowkey为rk0001,列族为f1,字段为name和age的内容

get 't1','rk0001','f1:name','f1:age'

5.查看t1表中rowkey为rk0001,列族为f1,f2

get 't1','rk0001','f1','f2'

6.获取t1表中rowkey为rk0001,然后cell的值为meimei的信息

get 't1', 'rk0001', {FILTER => "ValueFilter(=, 'binary:meimei')"}

7.获取t1表中rowkey为rk0001,cell的值中包含m的信息

get 't1','rk0001',{FILTER => "QualifierFilter(=,'substring:m')"}

8.全表扫描t1

scan 't1'

更新

这里也是一个知识点,那就是hbase理论上其实只有一种操作,就是写操作,所谓的更新和删除等其实都是写入操作,比如更新,其实就是新添加一条数据,然后添加一个版本,删除 也只是打上删除标记,这也是区别与mysql那种行式数据库的区别的地方。

更新还是用的插入的命令,比如下面

put 't1','rk0001','f2:age','11'

其实就是把t1表中rowkey为rk0001,列族为f2,age字段的值更新为11

查看表信息

desc 't1'

查看表t1的描述信息

更新列族f1的版本号为5

alter 't1',NAME=>'f1',VERSIONS=>5

再次查看一下

删除

语法:

delete

1.删除 t1表 ,rowkey为rk0001,f1:name的值

delete 't1','rk0001','f1:name'

2.删除t1表中的数据

truncate 't1'

3.删除整个t1表

disable 't1'
drop 't1'

这里需要注意一下,删除某个表前,需要先disable掉这个表。

总结

以上就是本文的全部内容了,如果觉得好,欢迎给个赞,或者关注本专栏,有了新的内容也会第一时间推送给你,关注不迷路哦,当然了本文只是列出了部分的内容,更多的内容可以查看help命令或者查看官方文档,有什么疑问也可以在下方给我留言哦!

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Hbase资料库
创建时间:2020-05-08 14:42:11
Hbase资料库一站式查询。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 小雨滴
    专家
  • Leila
    专家
  • 飘絮絮絮丶
    专家
戳我,来吐槽~