本篇博文讲述如何在springboot微服务中连接、创建、读取Hbase,实现通过spring-data-hadoop-hbase实现。

环境是3台Hbase物理机,安装了Hadoop HBase Zookeeper  :

172.xx.xx.151       hbase-1 (主)

172.xx.xx.154       hbase-2

172.xx.xx.153       hbase-3

如果环境由其他人安装,这时你需要拿到zookeeper的quorum参数,可以问也可以通过Zookeeper Dump状态查看,查看Quorum Server Statistics:内容,这里还包含了很多信息包括master地址是hbase-1,端口2181等

拿到这些数据就可以进行开发了,开发分为五个步骤:

1、pom.xml中增加依赖
2、修改配置文件application.yml
3、修改host文件,增加服务转发地址
4、工程增加配置文件
5、编写公共服务

 

1、pom.xml中增加依赖

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-hadoop-hbase</artifactId>
            <version>2.5.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-hadoop</artifactId>
            <version>2.5.0.RELEASE</version>
        </dependency>

注意这些依赖版本对应的需要jdk中的tool.jar为1.7版本,为什么需要tool.jar?因为hbase包隐式依赖tools.jar,不引入就会出现Missing artifact jdk.tools:jdk.tools:jar:1.7错误,解决方式从JDK1.7中复制一份tool.jar,改名为jdk.tools-1.7.jar,放到需要的服务器中,放到“”maven仓库地址\repository\jdk\tools\jdk.tools\1.7\jdk.tools-1.7.jar”下

然后再pom中放入依赖

<dependency>
	<groupId>jdk.tools</groupId>
	<artifactId>jdk.tools</artifactId>
	<version>1.7</version>
</dependency>

2、修改配置文件application.yml

hbase:
  zookeeper:
    quorum: 172.xx.xx.151,xxx.xx.xx.154,172.xx.xx.153
    property:
      clientPort: 2181

zookeeper:
  znode:
    parent: /hbase

如果Hbase部署时其他人,其中的quorum可以通过Zookeeper Dump查看

3、修改host文件,增加服务转发地址

172.xx.xx.151       hbase-1

172.xx.xx.154       hbase-2

172.xx.xx.153       hbase-3

4、工程增加配置文件

这里做了两个bean,一个是HbaseTemplate,一个是org.apache.hadoop.hbase.client.Connection,完全是开发方便,有的喜欢用HbaseTemplate封装好的,有的需要使用Connection自己封装一些方法使用

@Configuration
public class HBaseConfiguration {

    @Value("${hbase.zookeeper.quorum}")
    private String zookeeperQuorum;

    @Value("${hbase.zookeeper.property.clientPort}")
    private String clientPort;

    @Value("${zookeeper.znode.parent}")
    private String znodeParent;

    @Bean
    public HbaseTemplate hbaseTemplate() {
        org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
        conf.set("hbase.zookeeper.quorum", zookeeperQuorum);
        conf.set("hbase.zookeeper.property.clientPort", clientPort);
        conf.set("zookeeper.znode.parent", znodeParent);
        return new HbaseTemplate(conf);          
    }
    
    @Bean
    public Connection myfHbaseConnection(){
    	org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
        conf.set("hbase.zookeeper.quorum", zookeeperQuorum);
        conf.set("hbase.zookeeper.property.clientPort", clientPort);
        conf.set("zookeeper.znode.parent", znodeParent);
        conf.set("zookeeper.sasl.client", "false");//-------暂时保留不清楚用处
    	try {
			return ConnectionFactory.createConnection(conf);
		} catch (IOException e) {

			System.out.println("------Hbase初始化失败");
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
    } 
    
   
}

5、编写公共服务

下面完全需要个人自己发挥封装方法

a、创建接口类

public interface IMyfHbaseDataService {

	/**
	 * 输入 hbase 表名、点值如、日期串 如"2016-12-12",列族c 得到 list
	 */
	public List<String> getListDatabyPoints(String tableName,
			String pointCodes, String day, String cols);

    //.....
    //.....
    //.....
	
}

b、实现接口

实现过程中可以注入步骤4中的hbaseTemplate,

	@Autowired
	private HbaseTemplate hbaseTemplate;
	
	
	public HbaseTemplate getHbaseTemplate() {
		return hbaseTemplate;
	}
	public void setHbaseTemplate(HbaseTemplate hbaseTemplate) {
		this.hbaseTemplate = hbaseTemplate;
	}

也可以注入myfHbaseConnection,下面使用Conneticon注入

@Component
public class MyfHbaseDataServiceImpl implements IMyfHbaseDataService  {
	
	@Autowired
	private Connection myfHbaseConnection;


	public Connection getMyfHbaseConnection() {
		return myfHbaseConnection;
	}


	public void setMyfHbaseConnection(Connection myfHbaseConnection) {
		this.myfHbaseConnection = myfHbaseConnection;
	}




	/**
	 * 输入 hbase 表名、点值、日期串 如"2016-12-12",列族c 得到 list
     * 	"test1", pointCodes,"2016-12-18", "c"
	 */
	public List<String> getListDatabyPoints(String tableName,
			String pointCodes, String day, String cols) {

		
		List<String> dataList = new ArrayList<String>();

		// 拆分用来拼接rowkey
		String[] points = pointCodes.split(",");
		if (points.length <= 0)
			return null;

		List<Get> getList = new ArrayList<Get>();

		for (int i = 0; i < points.length; i++) {
			String rowkey = points[i] + (day.replaceAll("-", ""));
			Get get = new Get(Bytes.toBytes(rowkey));
			// 获取指定列族数据
			get.addFamily(Bytes.toBytes(cols));
			getList.add(get);
		}


		try {

			Table table = myfHbaseConnection.getTable(TableName.valueOf(tableName));

			// 获取指定列数据
			// get.addColumn(Bytes.toBytes(colFamily), Bytes.toBytes(col));

			// 得到 一整行数据: 不指定列的情况下
			Result[] results = table.get(getList);

			for (int j = 0; j < results.length; j++) {
				Result result = results[j];

				StringBuffer datas = new StringBuffer();// 查询后数据,拼结果串
				datas.append("");

				Cell[] cells = result.rawCells();
				for (Cell cell : cells) {
					if (datas.length() > 0)
						datas.append(",");
					datas.append(new String(CellUtil.cloneQualifier(cell))
							+ ":" + new String(CellUtil.cloneValue(cell)));

				}
				if (datas.length() == 0) {
					dataList.add("");
				} else {
					// 处理数据后,添加到list
					dataList.add(dealDataOneDay(datas));
				}
			}

			table.close();

		} catch (IOException e) {
			e.printStackTrace();
		}

		return dataList;
	}

    //其他根据业务自己封装
}

接下来就多说了,controlller中直接注入使用公共服务

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐