侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

数据库  /  管理员 发布于 6年前   164

 shell 命令行中操作HBase数据库

Shell控制

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

[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上去看看。

  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)命令,查询状态:

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

查询版本:

  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嘛。 

创建表对象:

  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中的对象是结构化的。

 查看表对象:

  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,保留时间),列的定义,块大小等等。 

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

禁用对象:

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

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

  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

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

 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

 插入记录: 

 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 

记录获取:

 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 

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

 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

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

  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

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

 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 

全表扫描:

 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

全表描述某个列:

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

删除记录行:

  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

 删除表:

  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天。

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


  • 上一条:
    error while loading shared libraries: libmysqlclient.so.18解决方法
    下一条:
    Openstack 使用migrate进行数据库升级实现方案详细介绍
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客