HBASE之shell操作和Java访问

对数据库HBASE的操作有shell端和java API两种方式。

在此之前要先说一下HBASE的结构及其数据存储结构:

HBASE是基于HDFS的,是一种NoSQL的数据库。它的数据模型如下所示:

Row Key Timestamp Column Family
URI Parser
r1 t3 url=http://www.taobao.com title=天天特价
t2 host=taobao.com  
t1    
r2 t5 url=http://www.alibaba.com content=每天…
t4 host=alibaba.com  

RowKey:行键,也是表的主键。表中的记录是按照Row Key排序。

Timestamp:时间戳,每次数据操作对应的时间戳,可以看作数据的version number。

ColumnFamily:列簇,Table在水平方向有一个或者多个Column Family组成,一个Column Family中可以由任意多个Column组成,即Column Family支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。

  • shell操作

shell中输入 hbase shell进入hbase操作,假设这样的person表:

rowid,username,userid,birth,phone,sex

创建该表需要使用:

  1. create ‘person‘,‘username‘,‘userid‘,‘birth‘,‘phone‘,‘sex‘

第一个是表名,后面都是属性,rowkey列不需要自己创建和设定列名。

ps,hbase shell 中,都没有分号做结尾。而且表名列名基本都加引号,这和SQL不一样。

加入单个数据,我们使用put命令。注意put命令的操作,只能一行一列的单个值去添加,不能一次加一行:

  1. put ‘person‘,‘1‘,‘username‘,‘Aran‘

表示person表中行号(row key)为1列名为username的值为Aran。

如果清空表,需要:

  1. truncate ‘person‘

如果删除表,需要:

  1. disable ‘person‘
  2. drop ‘person‘

Hbase中的查询分为两种:以rowkey方式的行查询,和以值为基础遍历.

rowkey方式:

  1. get ‘person‘,‘1‘

值查询:

  1. scan ‘person‘,FILTER=>"ValueFilter(=,‘binary:1992-2-12‘)"

Hbase支持cvs格式批量导入:

类似这样格式的文件    1,User1,8237764069450,2001-8-19,682318616,1

可以在shell中(不是hbase shell中)导入:

  1. hbase org.apache.hadoop.hbase.mapreduce.ImportTsv-Dimporttsv.separator=","-Dimporttsv.columns=HBASE_ROW_KEY,username,userid,birth,phone,sex person hdfs://192.168.70.28:9000/dataImport/HbaseTable-1.cvs

分割符为,并且,导入不用写rowkey,默认第一个就是rowkey。

就介绍这么多。详细的请参考:

http://www.jb51.net/article/31172.htm

http://blog.csdn.net/pirateleo/article/details/7956965

http://www.cnblogs.com/linjiqin/archive/2013/03/08/2949339.html

  • JAVA API

对于开发者而言,通过shell去操作数据还是很少见。我们可以使用JAVA API。

新建Java项目,添加的包有Hadoop下的Hadoop-core和Hbase/lib/下的所有jar。

只写了查询相关的Func,直接上代码:

  1. import java.io.IOException;
  2. import java.util.Iterator;
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.hbase.HBaseConfiguration;
  5. import org.apache.hadoop.hbase.HConstants;
  6. import org.apache.hadoop.hbase.KeyValue;
  7. import org.apache.hadoop.hbase.client.Get;
  8. import org.apache.hadoop.hbase.client.HTable;
  9. import org.apache.hadoop.hbase.client.HTablePool;
  10. import org.apache.hadoop.hbase.client.Result;
  11. import org.apache.hadoop.hbase.client.ResultScanner;
  12. import org.apache.hadoop.hbase.client.Scan;
  13. import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
  14. import org.apache.hadoop.hbase.filter.Filter;
  15. import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
  16. publicclassHbaseAPI{
  17. privatestaticConfiguration conf =null;
  18. static{
  19. conf =HBaseConfiguration.create();
  20. conf.set("hbase.zookeeper.property.clientPort","2181");
  21. conf.set("hbase.zookeeper.quorum","192.168.70.29");
  22. conf.set("hbase.master","192.168.70.28:60000");
  23. //timeout time
  24. conf.setLong(HConstants.HBASE_REGIONSERVER_LEASE_PERIOD_KEY,1200000);  
  25. }
  26. //query by rowkey
  27. publicstaticvoidQueryByrowKey(String tableName,String rowKey){
  28. try{
  29. HTable table =newHTable(conf,tableName);
  30. Get g =newGet(rowKey.getBytes());
  31. long start =System.currentTimeMillis();
  32. Result r = table.get(g);
  33. /*System.out.println("column:rowkey"  
  34.                         + "====value:" + new String(r.getRow()));
  35. for (KeyValue keyValue : r.raw()) {  
  36.                 System.out.println("column:" + new String(keyValue.getFamily())  
  37.                         + "====value:" + new String(keyValue.getValue()));  
  38.             }*/
  39. long end =  System.currentTimeMillis();
  40. System.out.println(end-start);
  41. }catch(IOException e){
  42. // TODO Auto-generated catch block
  43. e.printStackTrace();
  44. }
  45. }
  46. //query by condition
  47. publicstaticvoidQueryByCondition(String tableName,String columnName,String columnValue){
  48. try{
  49. HTable table =newHTable(conf,tableName);
  50. Filter filter =newSingleColumnValueFilter(columnName.getBytes(),null,CompareOp.EQUAL,columnValue.getBytes());
  51. Scan s =newScan();
  52. s.setFilter(filter);
  53. long start =System.currentTimeMillis();
  54. ResultScanner rs = table.getScanner(s);
  55. int hang =0;
  56. for(Result r : rs){
  57. /*System.out.println(new String(r.getRow()));
  58. System.out.println("column:rowkey"  
  59.                         + "====value:" + new String(r.getRow()));
  60. for (KeyValue keyValue : r.raw()) {  
  61.                System.out.println("column:" + new String(keyValue.getFamily())  
  62.                        + "====value:" + new String(keyValue.getValue()));  
  63.            }*/
  64. hang++;
  65. }
  66. long end =System.currentTimeMillis();
  67. System.out.println("rownum:"+hang);
  68. System.out.println(end-start);
  69. }catch(IOException e){
  70. // TODO Auto-generated catch block
  71. e.printStackTrace();
  72. }
  73. }
  74. publicstaticvoid main(String[] args){
  75. //HbaseAPI.QueryByrowKey("person1000", "12307999");
  76. //HbaseAPI.QueryByCondition("person1000", "username", "User2312397");
  77. HbaseAPI.QueryByCondition("person1000","sex","0");
  78. }
  79. }

特别说下conf.setLong(HConstants.HBASE_REGIONSERVER_LEASE_PERIOD_KEY, 1200000)表示的是每次访问最大时长,超过这个时长自动终止。

上文中的QueryByCondition并不准确,SingleColumnValueFilter的四个参数分别是列簇名、列名、过滤条件,过滤值。由于上文中的Hbase表每个列都是列簇,所以没有问题,现提供同时有列簇和列的查询:

  1. publicstaticvoidQueryByCondition(String tableName,String familyName,String columnName,String columnValue){
  2. try{
  3. HTable table =newHTable(conf,tableName);
  4. Filter filter =newSingleColumnValueFilter(familyName.getBytes(),columnName.getBytes(),CompareOp.EQUAL,columnValue.getBytes());
  5. Scan s =newScan();
  6. s.setCaching(1000);
  7. s.setFilter(filter);
  8. long start =System.currentTimeMillis();
  9. ResultScanner rs = table.getScanner(s);
  10. int hang =0;
  11. for(Result r : rs){
  12. System.out.println(newString(r.getRow()));
  13. System.out.println("column:rowkey"  
  14.                         +"====value:"+newString(r.getRow()));
  15. for(KeyValue keyValue : r.raw()){  
  16.                System.out.println("column:"+newString(keyValue.getFamily())+":"+newString(keyValue.getQualifier())
  17.                        +"====value:"+newString(keyValue.getValue()));  
  18.            }
  19. hang++;
  20. }
  21. long end =System.currentTimeMillis();
  22. System.out.println("rownum:"+hang);
  23. System.out.println(end-start);
  24. }catch(IOException e){
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }
  28. }

代码中有一个s.setCaching(),这涉及到了Hbase 的Scanner Caching功能:

base.client.scanner.caching配置项可以设置HBase scanner一次从服务端抓取的数据条数,默认情况下一次一条。通过将其设置成一个合理的值,可以减少scan过程中next()的时间开销,代价是scanner需要通过客户端的内存来维持这些被cache的行记录。

有三个地方可以进行配置:1)在HBase的conf配置文件中进行配置;2)通过调用HTable.setScannerCaching(int scannerCaching)进行配置;3)通过调用Scan.setCaching(int caching)进行配置。三者的优先级越来越高。

参考文件:

http://javacrazyer.iteye.com/blog/1186881

来自为知笔记(Wiz)

时间: 2024-08-01 17:38:55

HBASE之shell操作和Java访问的相关文章

HBase的SHELL操作和API

1.表结构: 2.SHELL操作 命令:hbase shell 显示表:list 创建表:create 'tb_name','column_family_1','column_family_2',...; 或者 create 'user', {NAME => 'column_family_1', VERSIONS => '3'} 插入数据:put 'tb_name','rk_on','column_family : key','value' 获取数据: 获取所有数据:get 'tb_name'

HBase的Shell操作

1.进入命令行 bin/hbase shell 2.输入help 查看各种命令组. 命令是分组的,可以执行help 'general'查看general组的命令. 3.常用命令 --显示有哪些表 list --显示表的DDL信息 describe '表名' --创建表 create 'table name','family name'... create 'table name',{NAME=>'family name',VERSIONS=>'5'} --删除表 --先关闭表 disable

Hbase数据结构和shell操作

Hbase的数据结构 基本要素:命名空间.表.行.列.单元格,region,时间戳. 1.命名空间:NameSpaces的作用 Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中. RegionServer group:一个命名空间包含了默认的RegionServer Group. Permission:权限,命名空间能够定义访问控制列表ACL(Access Control List).例如,创建表,读取表,删除,更新等等操作.

hbase之python利用thrift操作hbase数据和shell操作

前沿: 以前都是用mongodb的,但是量大了,mongodb显得不那么靠谱,改成hbase撑起一个量级. HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型.它存储的是松散型数据. HBase提供了丰富的访问接口. HBase Shell Java clietn API Jython.Groovy DSL.Scala REST Thrift(Ruby.Pyt

HBase(三)HBase集群Shell操作

一.进入HBase命令行 在你安装的随意台服务器节点上,执行命令:hbase shell,会进入到你的 hbase shell 客 户端 [[email protected] ~]$ hbase shell SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/module/hbase-1.2.6/lib/slf4j-log4j12-1.7.5.jar!/org/slf

Hbase快速开始——shell操作

一. 介绍 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务.  HBase以表的形式存储数据.表有行和列组成.列划分为若干个列族/列簇(column family).       如上图所示,key1, key2,

hbase shell操作语句

2019/2/19 星期二 hbase shell操作语句基本shell 命令 进入hbase 命令行./hbase shell显示hbase 中的表list创建user 表,包含info.data 两个列族create 'user', 'info1', 'data1'create 'user', {NAME => 'info', VERSIONS => '3'}向user 表中插入信息,row key 为rk0001,列族info 中添加name 列标示符,值为zhangsanput 'us

HBase ——Shell操作

HBase ——Shell操作 Q:你觉得HBase是什么? A:一种结构化的分布式数据存储系统,它基于列来存储数据. 基于HBase,可以实现以廉价PC机器集群存储海量数据的分布式数据库的解决方案. 一般用于数据量巨大但查询简单的场景,典型场景包括:账单记录,订单流水,交易记录,数据库的历史记录 建立表 HBase中没有数据库的概念,但是存在命名空间的概念,在使用上类似库名,但实际上只是一个目录名. 另外要记住,HBase中大部分数据都是以HashMap的形式组织的,因此很多时候都能看到类似

HBase概念学习(三)Java API之扫描和过滤器

HBase基本的CRUD操作就不多介绍了,无非就是Put,Get,Delete三个类的运用. 本文相当于是阅读HBase权威指南的总结. 一.扫描(Scan) 现在看一下扫描技术,这种技术类似于关系型数据库的游标(cursor),并利用到了HBase底层顺序存储的特性. 使用扫描的一般步骤是: 1.创建Scan实例 2.为Scan实例增加扫描的限制条件 3.调用HTable的getScanner()方法获取ResultScanner对象 4.迭代ResultScanner对象中的Result对象