服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - shell 命令行中操作HBase数据库实例详解

shell 命令行中操作HBase数据库实例详解

2021-12-01 16:57junsansi Linux

这篇文章主要介绍了 shell 命令行中操作HBase数据库实例详解的相关资料,需要的朋友可以参考下

 shell 命令行中操作HBase数据库

Shell控制

进入到shell命令行界面,执行hbase命令,并附加shell关键字: 

?
1
2
3
4
5
6
7
8
9
[grid@hdnode3 ~]$ hbase shell
 
HBase Shell; enter ¨help¨ for list of supported commands.
 
Type "exit" to leave the HBase Shell
 
Version 0.90.5, r1212209, Fri Dec 9 05:40:36 UTC 2011
 
 hbase(main):001:0>

 虽然成功登录进去了,可是我们也不知道现在能做什么,也不了解SHELL下都有哪些命令。这个时候,我们可以选择,去看官方文档中的说明,或者,敲个help上去看看。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
hbase(main):002:0> help
 
..................
 
..................
 
COMMAND GROUPS:
 
 Group name: general
 
 Commands: status, version
 
 
 Group name: ddl
 
 Commands: alter, create, describe, disable, drop, enable, exists, is_disabled, is_enabled, list
 
 
 Group name: dml
 
 Commands: count, delete, deleteall, get, get_counter, incr, put, scan, truncate
 
 
 Group name: tools
 
 Commands: assign, balance_switch, balancer, close_region, compact, flush, major_compact, move, split, unassign, zk_dump
 
 
 Group name: replication
 
 Commands: add_peer, disable_peer, enable_peer, remove_peer, start_replication, stop_replication
 
..................
 ..................

 帮助信息果然有帮助,通过输出的信息,我们大致了解能够做什么。可以看到hbase中也是分有ddl/dml这类语句,此外还有与复制相关的,与管理相关的命令等等。 

先来试试通用(general)命令,查询状态:

?
1
2
hbase(main):003:0> status
 5 servers, 0 dead, 0.4000 average load

查询版本:

?
1
2
3
hbase(main):004:0> version
 0.90.5, r1212209, Fri Dec 9 05:40:36 UTC 2011

接下来重点项,DDL和DML(想不到HBase也分了DML/DDL语句)。HBase中没有库的概念,做为BigTable的山寨产品,尽管没名山寨到名字,但山寨到了精髓,从设计上来说,它也不需要分库,甚至不需要分表,所有数据放到同一张表中也是可以的,这就是真正的BigTable嘛。 

创建表对象:

?
1
2
3
hbase(main):005:0> create ¨t¨,¨t_id¨,¨t_vl¨
 0 row(s) in 2.3490 seconds

 HBase中创建对象的语法比较灵活,前面这个示例是简写法,其功能等效于完整写法,"hbase> create ¨t¨, {NAME => ¨t_id¨}, {NAME => ¨t_vl¨}",第一个参数用于指定表名,后面跟的所有参数都是列族的名称。每个表的列族需要在表创建时定义好(尽管后期也可以修改,但最好一开始就定义好),从这个角度来看,HBase中的对象是结构化的。

 查看表对象:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
hbase(main):006:0> list
 
TABLE                                                                                 
 
t                                                                                   
 
1 row(s) in 0.0080 seconds
 
hbase(main):018:0> describe ¨t¨
 
DESCRIPTION                                                 ENABLED                         
 
{NAME => ¨t¨, FAMILIES => [{NAME => ¨t_id¨, BLOOMFILTER => ¨NONE¨, REPLICATION_SCOPE => ¨0¨, COMPRESSION => true                           
 
 ¨NONE¨, VERSIONS => ¨3¨, TTL => ¨2147483647¨, BLOCKSIZE => ¨65536¨, IN_MEMORY => ¨false¨, BLOCKCACHE => ¨t                             
 
rue¨}, {NAME => ¨t_vl¨, BLOOMFILTER => ¨NONE¨, REPLICATION_SCOPE => ¨0¨, COMPRESSION => ¨NONE¨, VERSIONS =>                             
 
 ¨3¨, TTL => ¨2147483647¨, BLOCKSIZE => ¨65536¨, IN_MEMORY => ¨false¨, BLOCKCACHE => ¨true¨}]}                                    
 1 row(s) in 0.0100 seconds

 输出的格式也是JSON串的形式,从中可以看到保留的版本数,TTL号(Time to Live,保留时间),列的定义,块大小等等。 

修改表对象,修改(含删除)前必须首先禁用对象,执行修改命令成功后,再启用对象。 

禁用对象:

?
1
2
3
hbase(main):004:0> disable ¨t¨
 0 row(s) in 2.0430 seconds

 判断当前表对象启用或禁用:

?
1
2
3
4
5
6
7
8
9
10
11
12
hbase(main):007:0> is_enabled ¨t¨
 
false                                                                                 
 
0 row(s) in 0.0040 seconds
 
 
hbase(main):008:0> is_disabled ¨t¨
 
true                                                                                 
 0 row(s) in 0.0040 seconds

 修改表对象,增加一个列族:

?
1
2
3
4
5
6
7
hbase(main):021:0> alter ¨t¨, {NAME => ¨t_info¨, VERSIONS => 3}  
 
0 row(s) in 0.0360 seconds
 
 
hbase(main):023:0> enable ¨t¨
 0 row(s) in 2.0250 seconds

 插入记录: 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
hbase(main):025:0> put ¨t¨,¨10001¨,¨t_vl:name¨,¨jss¨
 
0 row(s) in 0.0060 seconds
 
 
hbase(main):026:0> put ¨t¨,¨10001¨,¨t_vl:age¨,¨99¨
 
0 row(s) in 0.0070 seconds
 
 
hbase(main):027:0> put ¨t¨,¨10001¨,¨t_info:general¨,¨his fullname is junsanis!¨
 0 row(s) in 0.0040 seconds

记录获取:

?
1
2
3
4
5
6
7
8
9
10
11
hbase(main):028:0> get ¨t¨,¨10001¨
 
COLUMN                   CELL                                                           
 
t_info:general               timestamp=1365670813664, value=his fullname is junsanis!                                 
 
t_vl:age                  timestamp=1365670733223, value=99                                             
 
t_vl:name                 timestamp=1365670723056, value=jss                                            
 3 row(s) in 0.0450 seconds

获取指定记录中指定列族的数据:

?
1
2
3
4
5
6
7
8
hbase(main):029:0> get ¨t¨,¨10001¨,¨t_vl¨
 
COLUMN                   CELL                                                           
 
t_vl:age                  timestamp=1365670733223, value=99                                             
 
t_vl:name                 timestamp=1365670723056, value=jss                                            
 2 row(s) in 0.0070 seconds

 获取指定记录中指定列族中指定列的数据:

?
1
2
3
4
5
6
7
hbase(main):030:0> get ¨t¨,¨10001¨,¨t_vl:age¨
 
COLUMN                   CELL                                                           
 
t_vl:age                  timestamp=1365670733223, value=99                                             
 1 row(s) in 0.0070 seconds

 记录更新(跟插入没有区别):

?
1
2
3
4
5
6
7
8
9
10
11
12
hbase(main):031:0> put ¨t¨,¨10001¨,¨t_vl:age¨,¨10¨
 
0 row(s) in 0.0050 seconds
 
 
hbase(main):032:0> get ¨t¨,¨10001¨,¨t_vl:age¨
 
COLUMN                   CELL                                                           
 
t_vl:age                  timestamp=1365670912700, value=10                                             
 1 row(s) in 0.0080 seconds

全表扫描:

?
1
2
3
4
5
6
7
8
9
10
hbase(main):033:0> scan ¨t¨
 
ROW                     COLUMN+CELL                                                        
 
10001                   column=t_info:general, timestamp=1365670813664, value=his fullname is junsanis!                      
 
10001                   column=t_vl:age, timestamp=1365670912700, value=10                                    
 
10001                   column=t_vl:name, timestamp=1365670723056, value=jss                                   
 1 row(s) in 0.0370 seconds

全表描述某个列:

?
1
2
3
4
5
6
7
8
hbase(main):036:0> scan ¨t¨, {COLUMNS => ¨t_vl¨}
 
ROW                     COLUMN+CELL                                                        
 
10001                   column=t_vl:age, timestamp=1365670912700, value=10                                    
 
10001                   column=t_vl:name, timestamp=1365670723056, value=jss                                   
 1 row(s) in 0.0080 seconds

删除记录行:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
hbase(main):043:0> delete ¨t¨,¨10001¨,¨t_vl:age¨
 
0 row(s) in 0.0050 seconds
 
 
hbase(main):045:0> get ¨t¨,¨10001¨
 
COLUMN                   CELL                                                           
 
t_info:general               timestamp=1365670813664, value=his fullname is junsanis!                                 
 
t_vl:name                 timestamp=1365670723056, value=jss                                            
 2 row(s) in 0.0070 seconds

 删除表:

?
1
2
3
4
5
6
7
8
hbase(main):047:0> disable ¨t¨
 
0 row(s) in 2.0230 seconds
 
 
hbase(main):048:0> drop ¨t¨
 0 row(s) in 1.1170 seconds

 看完前面的例子,大家有没有问题,或者想到了什么?我脑子里反正是蹦出问号了:HBase中没有UPDATE操作,只有INSERT,可是我们每次put新记录都替换掉了旧的版本,怎么保存大量记录呢?难道每个row key的columns中只能存在一条记录?这不科学!这也显然不是人民群众期待并且喜闻乐见的表现嘛。 

这个问题呀,其实是列值保存版本(VERSIONS)或保留时间(TTL, Time to Liv)在起作用。 

比如,我们希望统计某用户的最近(n条)浏览记录,那么,创建HBase表对象如下: 

hbase> create ¨rlog¨,¨userid¨,{NAME=>¨article¨,VERSIONS=>100} 

当前设定,保留最近的100个版本。当用户浏览帖子时,就向rlog表中插入一条记录,形式如下: 

hbase> put ¨rlog¨,$userid,¨article:id¨,$aid

这里仅选择记录浏览的用户ID和浏览页面ID,也可以根据实际情况,保存页面的URL地址,文章标题等等信息。HBase表列族是非结构化的,大家可以根据需求任意增加列值。

那么,要获取用户最近浏览记录,应该怎么查呢?,比如说获取最近浏览的10条记录: 

hbase> get ¨rlog¨,$userid,{COLUMN=>¨article:id¨, VERSIONS=>10}

 除了通过VERSIONS控制外,还可以考虑通过版本的保存时间TTL来控制,TTL的单位是秒,默认一般是保存30天。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.itpub.net/7607759/viewspace-759609/

延伸 · 阅读

精彩推荐
  • Linuxlinux top命令详解

    linux top命令详解

    这篇文章主要介绍了linux top命令详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    sparkdev5622022-03-01
  • LinuxLinux系统下无法卸载挂载的目录怎么办?

    Linux系统下无法卸载挂载的目录怎么办?

    我们在日常运维中经常性会遇到需要进行磁盘的扩容、卸载、挂载等操作,但是有时候这个系统上跑的应用并没有停止或者有其他的运维同事在操作这个目...

    今日头条10302020-12-30
  • Linuxlinux驱动程序开发详细介绍

    linux驱动程序开发详细介绍

    前提,一般来说内核代码的错误可能会引起一个用户进程的死亡,或者整个系统的瘫痪,更严重的后果,可能导致磁盘损伤~因此建议最好有一台实验机进行...

    Linux教程网5392019-12-17
  • Linux理解 Linux/Unix 登录脚本的技巧

    理解 Linux/Unix 登录脚本的技巧

    有一些常见的情况,例如从Debian的包管理程序到Iaas的管理中,很多任务需要设置环境变量才能正常运行。 有时,程序通常只需要在 登陆时运行一次,例如...

    未知1042023-05-12
  • Linuxlinux设置tomcat自启动的方法

    linux设置tomcat自启动的方法

    这篇文章主要介绍了linux设置tomcat自启动的方法,需要的朋友可以参考下...

    Linux教程网8512021-10-10
  • Linux将 Linux 终端与 Nautilus 文件管理器结合起来

    将 Linux 终端与 Nautilus 文件管理器结合起来

    Nautilus 是 GNOME 桌面环境中的图形化文件浏览器。你可以使用它来访问和管理系统中的文件和文件夹。 尽管并非所有人都喜欢使用终端来管理文件和目录,...

    未知812023-08-08
  • Linuxssh 登录很慢该如何解决

    ssh 登录很慢该如何解决

    这篇文章主要介绍了ssh 登录很慢该如何解决的相关资料,这里提供了两种方法,DNS反向解析及关闭ssh的gssapi认证的解决办法,需要的朋友可以参考下...

    linuxeye9922021-12-16
  • Linux在Linux系统中创建新的亚马逊AWS访问密钥的方法

    在Linux系统中创建新的亚马逊AWS访问密钥的方法

    如何在Linux系统中创建新的亚马逊AWS访问密钥?我在配置一个需要访问我的亚马逊AWS帐号的应用时被要求提供AWS访问密钥ID和秘密访问密钥,我怎样创建一个...

    Linux教程网6182019-10-30