springboot微服务如何连接HBase
本篇博文讲述如何在springboot微服务中连接、创建、读取Hbase,实现通过spring-data-hadoop-hbase实现。环境是3台Hbase物理机,安装了Hadoop HBase Zookeeper :172.xx.xx.151hbase-1 (主)172.xx.xx.154hbase-2172.xx.xx.153hbas...
本篇博文讲述如何在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中直接注入使用公共服务
更多推荐
所有评论(0)