HBase入门 客户端操作

标签: Hadoop | 发表时间:2012-03-10 19:52 | 作者:jrckkyy
出处:http://hi.baidu.com/jrckkyy
HBase入门HBase入门

部分内容参考于http://www.nabble.com/Re%3A-Map-Reduce-over-HBase---sample-code-p18253120.html

HBase是Hadoop的一个子项目,HBase采用了Google BigTable的稀疏的,面向列的数据库实现方式的理论,建立在hadoop的hdfs上,一方面里用了hdfs的高可靠性和可伸缩行,另外一方面里用了BigTable的高效数据组织形式.可以说HBase为海量数据的real-time相应提供了很好的一个开源解决方案.据说在某运营商中使用类似于BigTable(个人猜测应该就是HBase)的技术可以在两秒时间内从2TB数据中查找到某条话费记录.而这是原来该运营商使用Oracle数据库所无法解决的问题.

对于HBase使用的类似与BigTable的技术我们这里就不仔细描述,可以参考google的论文以及网上的一些相关资料.另外,HBase的配置在HBase的官方文档中有很详细的描述.可以参见相关文档.

HBase提供了一个类似于mysql等关系型数据库的shell.通过该shell我们可以对HBase的内的相关表以及列族进行控制和处理.HBase shell的help命令比较详细的列出了HBase所支持的命令.具体使用方法可以参见其文档.

这里我们用一个学生成绩表作为例子,对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还是比较简单易用的,从中也可以看出HBase shell缺少很多传统sql中的一些类似于like等相关操作,当然,HBase作为BigTable的一个开源实现,而BigTable是作为google业务的支持模型,很多sql语句中的一些东西可能还真的不需要.

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

Java代码  
  1. import java.io.IOException;   
  2. import java.io.ByteArrayOutputStream;   
  3. import java.io.DataOutputStream;   
  4. import java.io.ByteArrayInputStream;   
  5. import java.io.DataInputStream;   
  6. import java.util.Map;   
  7. import org.apache.hadoop.io.Writable;   
  8. import org.apache.hadoop.io.IntWritable;   
  9. import org.apache.hadoop.hbase.HBaseConfiguration;   
  10. import org.apache.hadoop.hbase.HTableDescriptor;   
  11. import org.apache.hadoop.hbase.HColumnDescriptor;   
  12. import org.apache.hadoop.hbase.client.HBaseAdmin;   
  13. import org.apache.hadoop.hbase.client.HTable;   
  14. import org.apache.hadoop.hbase.io.BatchUpdate;   
  15. import org.apache.hadoop.hbase.io.RowResult;   
  16. import org.apache.hadoop.hbase.io.Cell;   
  17. import org.apache.hadoop.hbase.util.Writables;   
  18.   
  19. public class HBaseBasic {   
  20.   
  21.     public static void main(String[] args) throws Exception {   
  22.   
  23.         HBaseConfiguration config = new HBaseConfiguration();   
  24.   
  25.         HBaseAdmin admin = new HBaseAdmin(config);   
  26.   
  27.   
  28.         if (admin.tableExists("scores")) {   
  29.   
  30.             System.out.println("drop table");   
  31.   
  32.             admin.disableTable("scores");   
  33.   
  34.             admin.deleteTable("scores");   
  35.   
  36.         }   
  37.   
  38.         System.out.println("create table");   
  39.   
  40.         HTableDescriptor tableDescripter = new HTableDescriptor("scores".getBytes());   
  41.   
  42.         tableDescripter.addFamily(new HColumnDescriptor("grade:"));   
  43.   
  44.         tableDescripter.addFamily(new HColumnDescriptor("course:"));   
  45.   
  46.         admin.createTable(tableDescripter);   
  47.   
  48.   
  49.         HTable table = new HTable(config, "scores");   
  50.   
  51.         System.out.println("add Tom's data");   
  52.   
  53.         BatchUpdate tomUpdate = new BatchUpdate("Tom");   
  54.   
  55.         tomUpdate.put("grade:", Writables.getBytes(new IntWritable(1)));   
  56.   
  57.         tomUpdate.put("course:math", Writables.getBytes(new IntWritable(87)));   
  58.   
  59.         tomUpdate.put("course:art", Writables.getBytes(new IntWritable(97)));   
  60.   
  61.         table.commit(tomUpdate);   
  62.   
  63.         System.out.println("add Jerry's data");   
  64.   
  65.         BatchUpdate jerryUpdate = new BatchUpdate("Jerry");   
  66.   
  67.         jerryUpdate.put("grade:", Writables.getBytes(new IntWritable(2)));   
  68.   
  69.         jerryUpdate.put("course:math", Writables.getBytes(new IntWritable(100)));   
  70.   
  71.         jerryUpdate.put("course:art", Writables.getBytes(new IntWritable(80)));   
  72.   
  73.         table.commit(jerryUpdate);   
  74.   
  75.         for (RowResult row : table.getScanner(new String[] { "course:" })) {   
  76.   
  77.             System.out.format("ROW\t%s\n", new String(row.getRow()));   
  78.   
  79.             for (Map.Entry<byte[], Cell> entry : row.entrySet()) {   
  80.   
  81.                 String column = new String(entry.getKey());   
  82.   
  83.                 Cell cell = entry.getValue();   
  84.   
  85.                 IntWritable value = new IntWritable();   
  86.   
  87.                 Writables.copyWritable(cell.getValue(), value);   
  88.   
  89.                 System.out.format("  COLUMN\t%s\t%d\n", column, value.get());   
  90.   
  91.             }   
  92.         }   
  93.     }   
  94. }  
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;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.client.HBaseAdmin;import org.apache.hadoop.hbase.client.HTable;import org.apache.hadoop.hbase.io.BatchUpdate;import org.apache.hadoop.hbase.io.RowResult;import org.apache.hadoop.hbase.io.Cell;import org.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("create table");        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's data");        BatchUpdate tomUpdate = new BatchUpdate("Tom");        tomUpdate.put("grade:", Writables.getBytes(new IntWritable(1)));        tomUpdate.put("course:math", Writables.getBytes(new IntWritable(87)));        tomUpdate.put("course:art", Writables.getBytes(new IntWritable(97)));        table.commit(tomUpdate);        System.out.println("add Jerry's data");        BatchUpdate jerryUpdate = new BatchUpdate("Jerry");        jerryUpdate.put("grade:", Writables.getBytes(new IntWritable(2)));        jerryUpdate.put("course:math", Writables.getBytes(new IntWritable(100)));        jerryUpdate.put("course:art", Writables.getBytes(new IntWritable(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


转载于:http://labs.chinamobile.com/mblog/4110_22332
阅读全文
类别: Hadoop  查看评论

相关 [hbase 客户端] 推荐:

HBase入门 客户端操作

- - 学着站在巨人的肩膀上
HBase入门HBase入门. 部分内容参考于http://www.nabble.com/Re%3A-Map-Reduce-over-HBase---sample-code-p18253120.html. 对于HBase使用的类似与BigTable的技术我们这里就不仔细描述,可以参考google的论文以及网上的一些相关资料.另外,HBase的配置在HBase的官方文档中有很详细的描述.可以参见相关文档.

Windows7+Eclipse环境下Hbase Java客户端的开发

- - zzm
Centos 下Hbase0.98.10-hadoop2 集群的配置. 在Eclipse中创建Maven的工程. 将集群的hbase-site.xml文件放到工程的classes目录下. C:\windows\system32\drivers\etc文件,将Hbase集群的IP以及域名配置到该文件中.

HBase如何合理设置客户端Write Buffer - 大圆那些事 - 博客园

- -
大圆那些事| 转载请以超链接形式标明文章原始出处和作者信息. HBase客户端API提供了Write Buffer的方式,即批量提交一批Put对象到HBase服务端. 本文将结合HBase相关源码,对其进行深入介绍,分析如何在实际项目中合理设置和使用它. 什么时候需要Write Buffer. 默认情况下,一次Put操作即要与Region Server执行一次RPC操作,其执行过程可以被拆分为以下三个部分:.

hbase介绍

- AreYouOK? - 淘宝数据平台与产品部官方博客 tbdata.org
hbase是bigtable的开源山寨版本. 是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统. 它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作). 主要用来存储非结构化和半结构化的松散数据.

Riak对比HBase

- - NoSQLFan
文章来自 Riak官方wiki,是一篇Riak与HBase的对比文章. Riak官方的对比通常都做得很中肯,并不刻意偏向自家产品. 对比的Riak版本是1.1.x,HBase是0.94.x. Riak 与 HBase 都是基于 Apache 2.0 licensed 发布. Riak 的实现是基于 Amazon 的 Dynamo 论文,HBase 是基于 Google 的 BigTable.

[转]HBase简介

- - 小鸥的博客
   Hbase是一个分布式开源数据库,基于Hadoop分布式文件系统,模仿并提供了基于Google文件系统的Bigtable数据库的所有功能. 其目标是处理非常庞大的表,可以用普通的计算机处理超过10亿行数据,并且有数百万列元素组成的数据表. Hbase可以直接使用本地文件系统或者Hadoop作为数据存储方式,不过为了提高数据可靠性和系统的健壮性,发挥Hbase处理大数据量等功能,需要使用Hadoop作为文件系统.

HBase表设计

- - 互联网 - ITeye博客
默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据, 直到这 个region足够大了才进行切分. 一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按 照 region分区情况,在集群内做数据的负载均衡.

HBase Memstore配置

- - 行业应用 - ITeye博客
HBase Memstore配置. 本文为翻译,原英文地址:http://blog.sematext.com/2012/07/16/hbase-memstore-what-you-should-know/.     当regionserver(以下简称RS)收到一个写请求,会将这个请求定位到某个特定的region.

hbase原理

- - CSDN博客云计算推荐文章
1.hbase利用hdfs作为其文件存储系统,利用mapreduce来处理数据,利用zookeeper作为协调工具. 2.行键(row key),类似于主键,但row key是表自带的. 3.列族(column family) ,列(也称作标签/修饰符)的集合,定义表的时候指定的,列是在插入记录的时候动态增加的.

hbase锁机制

- - 数据库 - ITeye博客
博文说明:1、研究版本hbase0.94.12;2、贴出的源代码可能会有删减,只保留关键的代码.   hbase的锁是采用jdk的ReentrantReadWriteLock类实现.   一、HRegion有两种锁:lock、updatesLock,这两种锁均是ReentrantReadWriteLock类的实例,基本上所有的region操作均需要获取lock的read共享锁,在获取了lock的read锁后,如果是增加或者删除等影响数据内容的操作则还需要获取updatesLock的read锁.