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

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

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

(0)

相关推荐

  • 详解hbase与hive数据同步

    hive的表数据是可以同步到impala中去的.一般impala是提供实时查询操作的,像比较耗时的入库操作我们可以使用hive,然后再将数据同步到impala中.另外,我们也可以在hive中创建一张表同时映射hbase中的表,实现数据同步. 下面,笔者依次进行介绍. 一.impala与hive的数据同步 首先,我们在hive命令行执行showdatabases;可以看到有以下几个数据库: 然后,我们在impala同样执行showdatabases;可以看到: 目前的数据库都是一样的. 下面,我们

  • 深入浅析hbase的优点

    hbase是运行在Hadoop上的NoSQL数据库,它是一个分布式的和可扩展的大数据仓库,也就是说HBase能够利用HDFS的分布式处理模式,并从Hadoop的MapReduce程序模型中获益.这意味着在一组商业硬件上存储许多具有数十亿行和上百万列的大表.除去Hadoop的优势,HBase本身就是十分强大的数据库,它能够融合key/value存储模式带来实时查询的能力,以及通过MapReduce进行离线处理或者批处理的能力.总的来说,Hbase能够让你在大量的数据中查询记录,也可以从中获得综合分

  • Asp.Net Couchbase Memcached图文安装调用开发

    安装服务端 服务端下载地址:http://www.couchbase.com/download 选择适合自己的进行下载安装就可以了,我这里选择的是Win7 64. 在安装服务端如果发生如下所示的错误,我在win7 64安装的过程中就遇到了. 这个时候可以先撤销安装.通过CMD命令运行regedit.展开HKEY_LOCAL_MACHINE\Software\Microsoft\ Windows\ CurrentVersion分支,在窗口的右侧区域找到名为"ProgramFilesDir"

  • python操作 hbase 数据的方法

    配置 thrift python使用的包 thrift 个人使用的python 编译器是pycharm community edition. 在工程中设置中,找到project interpreter, 在相应的工程下,找到package,然后选择 "+" 添加, 搜索 hbase-thrift (Python client for HBase Thrift interface),然后安装包. 安装服务器端thrift. 参考官网,同时也可以在本机上安装以终端使用. thrift Ge

  • 基于HBase Thrift接口的一些使用问题及相关注意事项的详解

    HBase对于非Java语言提供了Thrift接口支持,这里结合对HBase Thrift接口(HBase版本为0.92.1)的使用经验,总结其中遇到的一些问题及其相关注意事项.1. 字节的存放顺序HBase中,由于row(row key和column family.column qualifier.time stamp)是按照字典序进行排序的,因此,对于short.int.long等类型的数据,通过Bytes.toBytes(-)转换成byte数组后,必须按照大端模式(高字节在低地址,低字节在

  • hbase 简介

    概述 HBase是一个构建在HDFS上的分布式列存储系统: HBase是基于GoogleBigTable模型开发的,典型的key/value系统: HBase是ApacheHadoop生态系统中的重要一员,主要用于海量结构化数据存储: 从逻辑上讲,HBase将数据按照表.行和列进行存储. 与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力. Hbase表的特点 大:一个表可以有数十亿行,上百万列: 无模式:每行都有一个可排序的主键和任意多的列,

  • hbase shell基础和常用命令详解

    HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务. 1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase

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

     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

  • Python操作MySQL数据库实例详解【安装、连接、增删改查等】

    本文实例讲述了Python操作MySQL数据库.分享给大家供大家参考,具体如下: 1.安装 通过Python连接MySQL数据库有很多库,这里使用官方推荐的MySQL Connector/Python库,其官网为:https://dev.mysql.com/doc/connector-python/en/. 通过pip命令安装: pip install mysql-connector-python 默认安装的是最新的版本,我安装的是8.0.17,对应MySQL的8.0版本.MySQL统一了其相关

  • node操作mysql数据库实例详解

    本文实例讲述了node操作mysql数据库的方法.分享给大家供大家参考,具体如下: 1.建立数据库连接:createConnection(Object)方法 该方法接受一个对象作为参数,该对象有四个常用的属性host,user,password,database.与php中链接数据库的参数相同.属性列表如下: host 连接数据库所在的主机名. (默认: localhost) port 连接端口. (默认: 3306) localAddress 用于TCP连接的IP地址. (可选) socket

  • python shell命令行中import多层目录下的模块操作

    首先在文件夹中添加_init_.py文件,即使是空文件也可以,多层文件夹,每层文件夹中都要添加. 比如我要import,a文件夹中,b文件夹下的 c.py 我就需要在a,b文件夹中都添加_init_.py文件. 然后引入方式:import a.b.c 然后在调用c.py的函数时,直接c.f()是不行的,需要a.b.c.f(). 当然也可以先写 c = a.b.c,然后再c.f(). 补充知识:Python IDLE shell中引入模块 安装了Python之后,会自带一个Python IDLE,

  • Android shell命令行中过滤adb logcat输出的方法

    我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adb logcat输出的方法.        1.只显示需要的输出(白名单) 最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配.简单的匹配一行当中的某个字符串,例如 MyApp: adb logcat | grep MyApp        adb logcat |

  • Android shell命令行中过滤adb logcat输出的几种方法

    我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adb logcat输出的方法.        1.只显示需要的输出(白名单) 最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配.简单的匹配一行当中的某个字符串,例如 MyApp: adb logcat | grep MyApp adb logcat | grep -i

  • C++利用MySQL API连接和操作数据库实例详解

    1.C++连接和操作MySQL的方式 系列文章: MySQL 设计和命令行模式下建立详解 C++利用MySQL API连接和操作数据库实例详解 在Windows平台,我们可以使用ADO.ODBC或者MySQL API进行连接和操作.ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的一个用于存取数据源的COM组件.它提供了程序语言和统一数据访问方式OLE DB的一个中间层,也就是Microsoft提出的应用程序接口(API)用以实现访问关系或非关

  • java 中mongodb的各种操作查询的实例详解

    java 中mongodb的各种操作查询的实例详解 一. 常用查询: 1. 查询一条数据:(多用于保存时判断db中是否已有当前数据,这里 is  精确匹配,模糊匹配 使用regex...) public PageUrl getByUrl(String url) { return findOne(new Query(Criteria.where("url").is(url)),PageUrl.class); } 2. 查询多条数据:linkUrl.id 属于分级查询 public Lis

  • Python脚本开发中的命令行参数及传参示例详解

    目录 sys模块 argparse模块 Python中的正则表达式 正则表达式简介 Re模块 常用的匹配规则 sys模块 在使用python开发脚本的时候,作为一个运维工具,或者是其他工具需要在接受用户参数运行时,这里就可以用到命令行传参的方式,可以给使用者一个比较友好的交互体验. python可以使用 sys 模块中的 sys.argv 命令来获取命令行参数,其中返回的参数是一个列表 在实际开发中,我们一般都使用命令行来执行 python 脚本 使用终端执行python文件的命令:python

  • Python中的Django基本命令实例详解

    一.新建项目 $django-admin.py  startproject  project_name # 特别是在 windows 上,如果报错,尝试用 django-admin 代替 django-admin.py 试试 注意 project_name 是自己的项目名称,需要为合法的 Python 包名,如不能为 1a 或 a-b. 二.新建APP 要先进入项目目录下,cd project_name 然后执行下面的命令: $ python manage.py startapp app_nam

随机推荐