HBase之四--(2):spring hadoop 访问hbase
1、 环境准备:
Maven
Eclipse
Java
Spring
2、 Maven pom.xml配置
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.3.0</version> <exclusions> <exclusion> <artifactId>jdk.tools</artifactId> <groupId>jdk.tools</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.3</version> <exclusions> <exclusion> <artifactId>jdk.tools</artifactId> <groupId>jdk.tools</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-hadoop</artifactId> <version>2.0.2.RELEASE</version> </dependency>
3、 Spring和hadoop、hbase相关配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:hdp="http://www.springframework.org/schema/hadoop" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/hadoop http://www.springframework.org/schema/hadoop/spring-hadoop-1.0.xsd">
其中标红的是spring hadoop xml命名空间配置。
Hadoop hbase相关配置文件如下:
对应的properties如下:
spring hbasetemplate配置如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:hdp="http://www.springframework.org/schema/hadoop" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/hadoop http://www.springframework.org/schema/hadoop/spring-hadoop-1.0.xsd"> <hdp:configuration> fs.default.name=hdfs://10.202.34.200:8020 </hdp:configuration> <hdp:hbase-configuration delete-connection="true" stop-proxy="false"> <!-- hbase.rootdir=${hbase.rootdir} --> <!-- hbase.zookeeper.quorum=${hbase.zookeeper.quorum} --> hbase.rootdir=hdfs://10.202.34.200:8020/hbase hbase.zookeeper.quorum=10.202.34.200 hbase.zookeeper.property.clientPort=2181 hbase.zookeeper.property.dataDir=/hbase hbase.cluster.distributed=true zookeeper.session.timeout=180000 hbase.zookeeper.property.tickTime=4000 dfs.replication=3 hbase.regionserver.handler.count=100 hbase.hregion.max.filesize=10737418240 hbase.regionserver.global.memstore.upperLimit=0.4 hbase.regionserver.global.memstore.lowerLimit=0.35 hfile.block.cache.size=0.2 hbase.hstore.blockingStoreFiles=20 hbase.hregion.memstore.block.multiplier=2 hbase.hregion.memstore.mslab.enabled=true hbase.client.scanner.timeout.period=6000000 hbase.client.write.buffer=20971520 hbase.hregion.memstore.flush.size=268435456 hbase.client.pause=20 hbase.client.retries.number=11 hbase.client.max.perserver.tasks=50 hbase.client.max.perregion.tasks=10 </hdp:hbase-configuration> <!-- <bean id="tablePool" class="org.apache.hadoop.hbase.client.HTablePool"> <constructor-arg ref="hbaseConfiguration" /> <constructor-arg value="100" /> </bean> --> <bean id="hbaseTemplate" class="org.springframework.data.hadoop.hbase.HbaseTemplate"> <property name="configuration" ref="hbaseConfiguration" /> </bean> </beans>
Hbasetemplate使用代码示例:
1
2
3
4
5
6
7
8
9
10
11
|
Tile t = hbaseTemplate.get( "GW_TILES" , "0_1_1" , new RowMapper<Tile>() { @Override public Tile mapRow(Result result, int rowNum) throws Exception { // TODO Auto-generated method stub Tile t = new Tile(); t.setData(result.getValue( "T" .getBytes(), "key" .getBytes())); return t; } }); |
Hbasetemplate 常用方法简介:
hbaseTemplate.get("GW_TILES", "0_1_1", new RowMapper 常用于查询,使用示例如下所示:
1
2
3
4
5
6
7
8
9
10
11
|
Tile t = hbaseTemplate.get( "GW_TILES" , "0_1_1" , new RowMapper<Tile>() { @Override public Tile mapRow(Result result, int rowNum) throws Exception { // TODO Auto-generated method stub Tile t = new Tile(); t.setData(result.getValue( "T" .getBytes(), "key" .getBytes())); return t; } }); |
hbaseTemplate.execute(dataIdentifier, new TableCallback 常用于更新操作,使用示例如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
return hbaseTemplate.execute(dataIdentifier, new TableCallback<Boolean>() { @Override public Boolean doInTable(HTableInterface table) throws Throwable { // TODO Auto-generated method stub boolean flag = false ; try { Delete delete = new Delete(key.getBytes()); table.delete(delete); flag = true ; } catch (Exception e){ e.printStackTrace(); } return flag; } }); |
备注:spring hbasetemplate针对hbase接口做了强大的封装,普通功能可以使用它强大的接口,同时复杂的功能,还可以使用hbase原生的接口,如:HTableInterface、Result等。其类方法如下图:
同时hbasetemplate封装了hbase连接池等,它的创建和释放通过配置来自动管理。
示例:
package com.sf.study.hbase; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.util.Bytes; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.data.hadoop.hbase.HbaseTemplate; import org.springframework.data.hadoop.hbase.RowMapper; public class SpringHbaseTest { public static void main(String[] agrs) { // 在xml配置文件中找到htemplate ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "classpath:/com/sf/study/META-INF/config/biz-hbase.xml" }); BeanFactory factory = (BeanFactory) context; HbaseTemplate htemplate = (HbaseTemplate) factory.getBean("hbaseTemplate"); // 使用find方法查找 fvp_dev_duan为表名 ,info为列族名称及family htemplate.find("fvp_dev_duan", "info", new RowMapper<String>() { // result为得到的结果集 public String mapRow(Result result, int rowNum) throws Exception { // 循环行 for (KeyValue kv : result.raw()) { // 得到列族组成列qualifier String key = new String(kv.getQualifier()); // 得到值 String value = new String(kv.getValue()); System.out.println(key + "= " + Bytes.toString(value.getBytes())); } return null; } }); } }
结果:
D= 10000092161011592W"7958687*209��n�