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代码      
      
         - 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());   
     -   
     -             }   
     -         }   
     -     }   
     - }  
 
   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