HBase使用例子

原文链接:http://blog.csdn.net/liuj2511981/article/details/8676519

通过编码(java)的形式对HBase进行一系列的管理涉及到对表的管理、数据的操作等。

1、 对表的创建、删除、显示以及修改等,可以用HBaseAdmin, 一旦创建了表,那么可以通过HTable的 实例来访问表,每次可以往表里增加数据。
2、 插入数据
创建一个Put对 象,在这个Put对象里可以指定要给哪个列增加数据,以及当前的时间戳等值,然后通过调用HTable.put(Put)来 提交操作,子猴在这里提请注意的是:在创建Put对象的时候,你必须指定一个行(Row)值,在构造Put对象的时候作为参数传入。
3、 获取数据
要获取数据,使用Get对 象,Get对象同Put对象一样有好几个构造函数,通常在构造的时候传入行值,表示取第几行的数据,通过HTable.get(Get)来 调用。
4、 浏览每一行
通过Scan可 以对表中的行进行浏览,得到每一行的信息,比如列名,时间戳等,Scan 相当于一个游标,通过next()来浏览下一个,通过调用HTable.getScanner(Scan) 来返回一个ResultScanner对象。HTable.get(Get)和HTable.getScanner(Scan) 都是返回一个Result。 Result是一个KeyValue的 链表,
5、 删除
使用Delete来 删除记录,通过调用HTable.delete(Delete)来 执行删除操作。(注:删除这里有些特别,也就是删除并不是马上将数据从表中删除。)
6、 锁
7、 新增、获取、删除在操作过程中会对所操作的行加一个锁,而浏览却不会。
8、 簇(cluster)的访问
客户端代码通过ZooKeeper来访问找到簇,也就是说ZooKeeper quorum将被使用,那么相关的类(包)应该在客户端的类(classes)目录下,即客户端一定要找到文件hbase- site.xml。
下面是一个例子,假定你已经创建了一个表:myTable,还有一个column family(这个找不到合适的翻译词语):myColumnFamily:
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的基本操作和基本概念进行讲解:
下面是学生的成绩表:
[sql]  view plain copy
  1. name grad      course:math   course:art  
  2. Tom    1            87                    97  
  3. Jerry   2            100                  80  

这里grad对于表来说是一个列,course对于表来说是一个列族,这个列族由两个列组成:math和art,当然我们可以根据我们的需要在course中建立更多的列族,如computer,physics等相应的列添加入course列族.
有了上面的想法和需求,我们就可以在HBase中建立相应的数据表啦!
1, 建立一个表格 scores 具有两个列族grad 和courese
[sql]  view plain copy
  1. hbase(main):002:0> create 'scores''grade''course'  
  2. 0 row(s) in 4.1610 seconds  

2,查看当先HBase中具有哪些表
[sql]  view plain copy
  1. hbase(main):003:0> list  
  2. scores  
  3. 1 row(s) in 0.0210 seconds  

3,查看表的构造
[sql]  view plain copy
  1. hbase(main):004:0> describe 'scores'  
  2. {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'}]}  
  3. 1 row(s) in 0.0130 seconds  

4, 加入一行数据,行名称为 Tom 列族grad的列名为”” 值位1
[sql]  view plain copy
  1. hbase(main):005:0> put 'scores''Tom''grade:''1'  
  2. 0 row(s) in 0.0070 seconds  

5,给Tom这一行的数据的列族添加一列 <math,87>
[sql]  view plain copy
  1. hbase(main):006:0> put 'scores''Tom''course:math''87'  
  2. 0 row(s) in 0.0040 seconds  

[sql]  view plain copy
  1. 6,给Tom这一行的数据的列族添加一列 <art,97>  
  2. hbase(main):007:0> put 'scores''Tom''course:art''97'  
  3. 0 row(s) in 0.0030 seconds  
  4. 7, 加入一行数据,行名称为 Jerry 列族grad的列名为”” 值位2  
  5. hbase(main):008:0> put 'scores''Jerry''grade:''2'  
  6. 0 row(s) in 0.0040 seconds  
  7. 8,给Jerry这一行的数据的列族添加一列 <math,100>  
  8. hbase(main):009:0> put 'scores''Jerry''course:math''100'  
  9. 0 row(s) in 0.0030 seconds  
  10. 9,给Jerry这一行的数据的列族添加一列 <art,80>  
  11. hbase(main):010:0> put 'scores''Jerry''course:art''80'  
  12. 0 row(s) in 0.0050 seconds  
  13. 10,查看scores表中Tom的相关数据  
  14. hbase(main):011:0> get 'scores''Tom'  
  15. COLUMN                       CELL  
  16.  course:art                  timestamp=1224726394286, value=97  
  17.  course:math                 timestamp=1224726377027, value=87  
  18.  grade:                      timestamp=1224726360727, value=1  
  19. 3 row(s) in 0.0070 seconds  
  20. 11,查看scores表中所有数据  
  21. hbase(main):012:0> scan 'scores'  
  22. ROW                          COLUMN+CELL  
  23.  Tom                         column=course:art, timestamp=1224726394286, value=97  
  24.  Tom                         column=course:math, timestamp=1224726377027, value=87  
  25.  Tom                         column=grade:, timestamp=1224726360727, value=1  
  26.  Jerry                        column=course:art, timestamp=1224726424967, value=80  
  27.  Jerry                        column=course:math, timestamp=1224726416145, value=100  
  28.  Jerry                        column=grade:, timestamp=1224726404965, value=2  
  29. 6 row(s) in 0.0410 seconds  
  30. 12,查看scores表中所有数据courses列族的所有数据  
  31. hbase(main):013:0> scan 'scores', ['course:']  
  32. ROW                          COLUMN+CELL  
  33.  Tom                         column=course:art, timestamp=1224726394286, value=97  
  34.  Tom                         column=course:math, timestamp=1224726377027, value=87  
  35.  Jerry                        column=course:art, timestamp=1224726424967, value=80  
  36.  Jerry                        column=course:math, timestamp=1224726416145, value=100  
  37. 4 row(s) in 0.0200 seconds  

上面就是HBase的基本shell操作的一个例子,可以看出,hbase的shell还是比较简单易用的,从中也可以看出HBase shell缺少很多传统sql中的一些类似于like等相关操作,当然,HBase作为BigTable的一个开源实现,而BigTable是作为google业务的支持模型,很多sql语句中的一些东西可能还真的不需要.
当然,通过程序我们也可以对HBase进行相关的操作.下面的程序就完成了上面shell操作的内容:
[java]  view plain copy
  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.         HBaseConfiguration config = new HBaseConfiguration();  
  23.         HBaseAdmin admin = new HBaseAdmin(config);  
  24.   
  25.         if (admin.tableExists("scores")) {  
  26.             System.out.println("drop table");  
  27.             admin.disableTable("scores");  
  28.             admin.deleteTable("scores");  
  29.         }  
  30.   
  31.         System.out.println("create table");  
  32.         HTableDescriptor tableDescripter = newHTableDescriptor("scores".getBytes());  
  33.         tableDescripter.addFamily(newHColumnDescriptor("grade:"));  
  34.         tableDescripter.addFamily(newHColumnDescriptor("course:"));  
  35.         admin.createTable(tableDescripter);  
  36.   
  37.         HTable table = new HTable(config, "scores");  
  38.   
  39.         System.out.println("add Tom's data");  
  40.         BatchUpdate tomUpdate = new BatchUpdate("Tom");  
  41.         tomUpdate.put("grade:", Writables.getBytes(newIntWritable(1)));  
  42.         tomUpdate.put("course:math", Writables.getBytes(newIntWritable(87)));  
  43.         tomUpdate.put("course:art", Writables.getBytes(newIntWritable(97)));  
  44.         table.commit(tomUpdate);  
  45.   
  46.         System.out.println("add Jerry's data");  
  47.         BatchUpdate jerryUpdate = new BatchUpdate("Jerry");  
  48.         jerryUpdate.put("grade:", Writables.getBytes(newIntWritable(2)));  
  49.         jerryUpdate.put("course:math", Writables.getBytes(newIntWritable(100)));  
  50.         jerryUpdate.put("course:art", Writables.getBytes(newIntWritable(80)));  
  51.         table.commit(jerryUpdate);  
  52.   
  53.         for (RowResult row : table.getScanner(new String[] {"course:" })) {  
  54.             System.out.format("ROW\t%s\n", newString(row.getRow()));  
  55.             for (Map.Entry<byte[], Cell> entry : row.entrySet()) {  
  56.                 String column = new String(entry.getKey());  
  57.                 Cell cell = entry.getValue();  
  58.                 IntWritable value = new IntWritable();  
  59.                 Writables.copyWritable(cell.getValue(), value);  
  60.                 System.out.format("  COLUMN\t%s\t%d\n", column, value.get());  
  61.             }  
  62.         }  
  63.     }  
  64. }  
  65.     输出如下:  
  66. drop table  
  67. 09/07/11 08:51:59 INFO client.HBaseAdmin: Disabled scores  
  68. 09/07/11 08:51:59 INFO client.HBaseAdmin: Deleted scores  
  69. create table  
  70. add Tom's data  
  71. add Jerry's data  
  72. ROW     Tom  
  73.   COLUMN        course:art      97  
  74.   COLUMN        course:math     87  
  75. ROW     Jerry  
  76.   COLUMN        course:art      80  
  77.   COLUMN        course:math     100  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值