SpringBoot+HBase查询

最近手里有个项目是SpringBoot搭建的,主要使用spring-data-hadoop-hbase来实现。
参考了几篇网上的文章,用的都是xml方式,当然官网给的sample也是xml方式,具体可以参考
https://github.com/spring-projects/spring-hadoop-samples/tree/master/hbase
这里将这个方式简单转换成javaconfig的方式,用注解结合springboot的application.yml进行配置,并生成HBaseTemplate进行查询。

引入相关依赖

具体版本以实际为准,下面几个版本在我项目中测试通过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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>

增加配置

官方提供的方式是通过xml方式,简单改写后如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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);
}
}

application.yml

1
2
3
4
5
6
7
8
9
hbase:
zookeeper:
quorum: hbase1.xxx.org,hbase2.xxx.org,hbase3.xxx.org
property:
clientPort: 2181

zookeeper:
znode:
parent: /hbase

在service类注入HBaseTemplate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@Service
@Slf4j
public class HBaseService {


@Autowired
private HbaseTemplate hbaseTemplate;


public List<Result> getRowKeyAndColumn(String tableName, String startRowkey, String stopRowkey, String column, String qualifier) {
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
if (StringUtils.isNotBlank(column)) {
log.debug("{}", column);
filterList.addFilter(new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(column))));
}
if (StringUtils.isNotBlank(qualifier)) {
log.debug("{}", qualifier);
filterList.addFilter(new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(qualifier))));
}
Scan scan = new Scan();
if (filterList.getFilters().size() > 0) {
scan.setFilter(filterList);
}
scan.setStartRow(Bytes.toBytes(startRowkey));
scan.setStopRow(Bytes.toBytes(stopRowkey));

return hbaseTemplate.find(tableName, scan, (rowMapper, rowNum) -> rowMapper);
}

public List<Result> getListRowkeyData(String tableName, List<String> rowKeys, String familyColumn, String column) {
return rowKeys.stream().map(rk -> {
if (StringUtils.isNotBlank(familyColumn)) {
if (StringUtils.isNotBlank(column)) {
return hbaseTemplate.get(tableName, rk, familyColumn, column, (rowMapper, rowNum) -> rowMapper);
} else {
return hbaseTemplate.get(tableName, rk, familyColumn, (rowMapper, rowNum) -> rowMapper);
}
}
return hbaseTemplate.get(tableName, rk, (rowMapper, rowNum) -> rowMapper);
}).collect(Collectors.toList());
}
}

我这里只用了hbaseTemplatefind以及get方法,当然里面还有很多其他有用的方法,可以进一步研究研究。


SpringBoot+HBase查询
https://wangqianying.com/2018/12/05/2018-12-05-springboot-hbase/
作者
wang fei
发布于
2018年12月5日
许可协议