注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

技术行者

时代的车轮在按照摩尔定律滚动。

 
 
 

日志

 
 

Hbase命令  

2011-07-16 16:00:00|  分类: 分布式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

HBase的许多代码是重用HADOOP的代码。它与我们常用的数据库的最大区别就是列存储以及无数据类型,所有数据都以String类型进行存储。而且,假如hbase table里面有5个字段,但是实际上只有4个字段有值,另一个为NULL,那么这个字段是不占存储空间的,相比较而言,这点比较好罢。

     HBase是一个开源的、分布式的、面向列的存储系统。源于论文《Bigtable:一个结构化数据的分布式存储系统》。就像Bigtable利用了Googl文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式。HBase使用和Bigtable非常相同的数据模型。用户存储数据行在一个表里。一个数据行拥有一个可选择的键和任意数量的列。表是疏松的存储的,因此用户可以给行定义各种不同的列。HBase主要用于需要随机访问,实时读写你的大数据(Big Data)。

     HBase项目是为那些Oracle年许可费够得上一个小国家的国民生产总值(GNP)或由于其库表中有一些BLOB列且行数达到了数百万级因而导致MySQL濒临崩溃的用户提供的。任何拥有大量的结构化或半结构化数据、而且正受限于关系数据库管理系统(RDBMS)的用户都可以看看HBase。另一个方面,HBase采用了Bigtable的稀疏式的,面向列的数据库实现方式的理论,同时建立在Hadoop的HDFS上,利用HDFS的高可靠性和可伸缩性。也用到BigTable的高效数据组织形式.可以说HBase为海量数据的实时性相应提供了很好的一个开源解决方案.据说在某运营商中使用类似于BigTable(个人猜测应该就是HBase)的技术可以在两秒时间内从2TB数据中查找到某条话费记录.而这是原来该运营商使用Oracle数据库所无法解决的问题。

HBase提供了一个类似于mysql等关系型数据库的shell.通过该shell我们可以对HBase的内的相关表以及列族进行控制和处理.HBase shell的help命令比较详细的列出了HBase所支持的命令,可以查阅。

 

下面是学生成绩表的举例:

name grad      course:math   course:art

Tom    1          87                  97

Jerry  2          100                  80

这里grad对于表来说是一个列,course对于表来说是一个列族,这个列族由两个列组成:math和art,当然我们可以根据我们的需要在course中建立更多的列族,如computer,physics等相应的列添加入course列族。

有了上面的想法和需求,我们就可以在HBase中建立相应的数据表啦!

 

1, 建立一个表格scores 具有两个列族grad 和courese

hbase(main):002:0> create 'scores','grade', 'course'

0 row(s) in 4.1610 seconds

 

2,查看当先HBase中具有哪些表

hbase(main):003:0> list

scores

1 row(s) in 0.0210 seconds

 

 

3,查看表的构造

hbase(main):004:0> describe 'scores'

{NAME => 'scores', IS_ROOT =>'false', IS_META => 'false', FAMILIES => [{NAME => 'course',BLOOMFILTER => 'false', IN_MEMORY => 'false', LENGTH => '2147483647',BLOCKCACHE => 'false', VERSIONS => '3', TTL => '-1', COMPRESSION =>'NONE'}, {NAME => 'grade', BLOOMFILTER => 'false', IN_MEMORY =>'false', LENGTH => '2147483647', BLOCKCACHE => 'false', VERSIONS =>'3', TTL => '-1', COMPRESSION => 'NONE'}]}

1 row(s) in 0.0130 seconds

 

4, 加入一行数据,行名称为Tom 列族grad的列名为”” 值位1

hbase(main):005:0> put 'scores', 'Tom','grade:', '1'

0 row(s) in 0.0070 seconds

 

5,给Tom这一行的数据的列族添加一列<math,87>

hbase(main):006:0> put 'scores', 'Tom','course:math', '87'

0 row(s) in 0.0040 seconds

 

6,给Tom这一行的数据的列族添加一列<art,97>

hbase(main):007:0> put 'scores', 'Tom','course:art', '97'

0 row(s) in 0.0030 seconds

 

7, 加入一行数据,行名称为Jerry 列族grad的列名为”” 值位2

hbase(main):008:0> put 'scores','Jerry', 'grade:', '2'

0 row(s) in 0.0040 seconds

 

8,给Jerry这一行的数据的列族添加一列<math,100>

hbase(main):009:0> put 'scores','Jerry', 'course:math', '100'

0 row(s) in 0.0030 seconds

 

9,给Jerry这一行的数据的列族添加一列<art,80>

hbase(main):010:0> put 'scores','Jerry', 'course:art', '80'

0 row(s) in 0.0050 seconds

 

10,查看scores表中Tom的相关数据

hbase(main):011:0> get 'scores', 'Tom'

COLUMN                      CELL

 course:art                 timestamp=1224726394286, value=97

 course:math                timestamp=1224726377027, value=87

 grade:                     timestamp=1224726360727, value=1

3 row(s) in 0.0070 seconds

 

11,查看scores表中所有数据

hbase(main):012:0> scan 'scores'

ROW                        COLUMN+CELL

 Tom                        column=course:art, timestamp=1224726394286, value=97

 Tom                        column=course:math, timestamp=1224726377027, value=87

 Tom                        column=grade:, timestamp=1224726360727, value=1

 Jerry                       column=course:art, timestamp=1224726424967, value=80

 Jerry                       column=course:math, timestamp=1224726416145, value=100

 Jerry                       column=grade:, timestamp=1224726404965, value=2

6 row(s) in 0.0410 seconds

 

12,查看scores表中所有数据courses列族的所有数据

hbase(main):013:0> scan 'scores',['course:']

ROW                         COLUMN+CELL

 Tom                        column=course:art, timestamp=1224726394286, value=97

 Tom                        column=course:math, timestamp=1224726377027, value=87

 Jerry                       column=course:art, timestamp=1224726424967, value=80

 Jerry                       column=course:math, timestamp=1224726416145, value=100

4 row(s) in 0.0200 seconds

 

 

 上面就是HBase的基本shell操作的一个例子,可以看出,hbase的shell还是比较简单易用的,从中也可以看出HBaseshell缺少很多传统sql中的一些类似于like等相关操作,当然,HBase作为BigTable的一个开源实现,而BigTable是作为google业务的支持模型,很多sql语句中的一些东西可能还真的不需要。

 当然,通过程序我们也可以对HBase进行相关的操作.下面的程序就完成了上面shell操作的内容:

import java.io.IOException;

import java.io.ByteArrayOutputStream;

import java.io.DataOutputStream;

import java.io.ByteArrayInputStream;

import java.io.DataInputStream;

import java.util.Map;

import org.apache.hadoop.io.Writable;

import org.apache.hadoop.io.IntWritable;

importorg.apache.hadoop.hbase.HBaseConfiguration;

importorg.apache.hadoop.hbase.HTableDescriptor;

importorg.apache.hadoop.hbase.HColumnDescriptor;

import org.apache.hadoop.hbase.client.HBaseAdmin;

importorg.apache.hadoop.hbase.client.HTable;

importorg.apache.hadoop.hbase.io.BatchUpdate;

importorg.apache.hadoop.hbase.io.RowResult;

import org.apache.hadoop.hbase.io.Cell;

importorg.apache.hadoop.hbase.util.Writables;


public class HBaseBasic {


    public static void main(String[] args) throws Exception {

       HBaseConfiguration config = new HBaseConfiguration();

       HBaseAdmin admin = new HBaseAdmin(config);


        if(admin.tableExists("scores")) {

           System.out.println("drop table");

           admin.disableTable("scores");

           admin.deleteTable("scores");

       }


        System.out.println("createtable");

       HTableDescriptor tableDescripter = new HTableDescriptor("scores".getBytes());

       tableDescripter.addFamily(new HColumnDescriptor("grade:"));

       tableDescripter.addFamily(new HColumnDescriptor("course:"));

       admin.createTable(tableDescripter);


        HTable table = new HTable(config,"scores");


        System.out.println("add Tom'sdata");

       BatchUpdate tomUpdate = new BatchUpdate("Tom");

       tomUpdate.put("grade:", Writables.getBytes(new IntWritable(1)));

       tomUpdate.put("course:math", Writables.getBytes(newIntWritable(87)));

        tomUpdate.put("course:art",Writables.getBytes(new IntWritable(97)));

       table.commit(tomUpdate);


        System.out.println("add Jerry'sdata");

       BatchUpdate jerryUpdate = new BatchUpdate("Jerry");

       jerryUpdate.put("grade:", Writables.getBytes(new IntWritable(2)));

       jerryUpdate.put("course:math", Writables.getBytes(newIntWritable(100)));

       jerryUpdate.put("course:art", Writables.getBytes(newIntWritable(80)));

       table.commit(jerryUpdate);


        for (RowResult row :table.getScanner(new String[] { "course:" })) {

           System.out.format("ROW/t%s/n", new String(row.getRow()));

           for (Map.Entry<byte[], Cell> entry : row.entrySet()) {

               String column = new String(entry.getKey());

               Cell cell = entry.getValue();

               IntWritable value = new IntWritable();

               Writables.copyWritable(cell.getValue(), value);

               System.out.format("  COLUMN/t%s/t%d/n", column, value.get());

           }

       }

    }

}

 输出如下:

drop table

09/07/11 08:51:59 INFO client.HBaseAdmin:Disabled scores

09/07/11 08:51:59 INFO client.HBaseAdmin:Deleted scores

create table

add Tom's data

add Jerry's data

ROW     Tom

 COLUMN       course:art      97

  COLUMN       course:math     87

ROW     Jerry

 COLUMN       course:art      80

 
  COLUMN       course:math     100

 

  评论这张
 
阅读(338)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017