先了解下Hbase的一些术语:
RowKey:是Byte array,是表中每条记录的“主键”,方便快速查找,Rowkey的设计非常重要。
Column Family:列族,拥有一个名称(string),包含一个或者多个相关列Column:属于某一个columnfamily,familyName:columnName,每条记录可动态添加
Version Number:类型为Long,默认值是系统时间戳,可由用户自定义
Value(Cell):Byte array,对应column
具体应该类似 rowkey | column family |
rowkey1 | col1:aa col2:bb |
rowkey1类似于这条记录的主键,col1是这个列族中的一列对应值是aa,col2是另外一个column对应值是bb,他们共同属于一个列族。一个rowkey可以对应有多个列族。 这里简单说一下,具体可看下hbase的概念和原理,下面具体说下java对hbase的访问编程。
最近开始弄这个就是被几个依赖包搞的半天调不通,先贴上。。。。
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<span style="font-family: Arial, Helvetica, sans-serif;"> <version>2.2.0</version></span></span>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-annotations</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase</artifactId>
<version>0.94.18-hadoop2</version>
</dependency>
接下来写的时候少啥就是一顿import就行了。。。先是设置下基本的配置,这里有两种方式,一种是直接程序中写如下:
public Configuration conf = null;
conf.set("hbase.zookeeper.quorum", "server1,server2,server3");
conf.set("hbase.zookeeper.property.clientPort", "2181");
conf.set("zookeeper.znode.parent", "/hbase_path");//如果有配置的话
另一种就是读取配置文件用
conf = HBaseConfiguration.create();
这个函数来读取文件配置,如果是工程项目,他默认找资源目录下的hbase-site.xml这个文件,加载其中配置,与hbase服务器端配置保持一致
两种方式配置效果是一样的,这样拿到了conf就可以进行具体操作了<configuration> <property> <name>hbase.zookeeper.quorum</name> <value>server1,server2,server3</value> </property> <property> <name>zookeeper.session.timeout</name> <value>60000</value> </property> <property> <name>zookeeper.znode.parent</name> <value>/hbase_path</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> </configuration>
1、判断表TABLE_NAME是否存在
2、插入一条数据HBaseAdmin hAdmin = new HBaseAdmin(conf); System.out.println(hAdmin.tableExists(TABLE_NAME));
HTable table = new HTable(conf, TABLE_NAME1);
3、删除数据Put put = new Put(Bytes.toBytes(ROW_KEY));//插入一条数据的rowkey为ROW_KEY,必须为bytes形式 put.add(Bytes.toBytes("a"), Bytes.toBytes("a-key"),Bytes.toBytes("a-value"));//插入到列族名为a,列名为a-key,值为a-value table.put(put);
4、查询一条数据HTable table = new HTable(conf, TABLE_NAME1);//找到要删除数据对应的表 List list = new ArrayList(); Delete del1 = new Delete(Bytes.toBytes("112233"));//删除rowkey为112233的这条数据 Delete del2 = new Delete(Bytes.toBytes("aaaabbbb")); list.add(del1); list.add(del2); table.delete(list);//支持传入list多条删除,添加也是同样支持的
HTable table = new HTable(conf, TABLE_NAME1);//锁定查询的表 Get get = new Get(Bytes.toBytes(ROW_KEY1));//锁定查询的rowkey Result rs = table.get(get);//一个rowkey对应的可能多条不同列族和列数据 for (KeyValue kv : rs.raw()) { System.out.println(new String(kv.getRow()) + " "); System.out.println(new String(kv.getFamily()) + ":"); System.out.println(new String(kv.getQualifier()) + " "); System.out.println(kv.getTimestamp() + " "); System.out.println(new String(kv.getValue())); }
5、扫描全部数据
差不多就这些基本操作,还有建表、删表等,都类似。HTable table = new HTable(conf, TABLE_NAME1); Scan s = new Scan(); ResultScanner ss = table.getScanner(s); for (Result r : ss) { for (KeyValue kv : r.raw()) { System.out.print(new String(kv.getRow()) + " "); System.out.print(new String(kv.getFamily()) + ":"); System.out.print(new String(kv.getQualifier()) + " "); System.out.print(kv.getTimestamp() + " "); System.out.println(new String(kv.getValue())); } }