HBase入门

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 => }

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这一行的数据的列族添加一列

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

0 row(s) in 0.0040 seconds

6,给Tom这一行的数据的列族添加一列

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这一行的数据的列族添加一列

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

0 row(s) in 0.0030 seconds

9,给Jerry这一行的数据的列族添加一列

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\',

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操作的内容:

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 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值