背景
用户中心有一个设备指纹的子系统,收集用户的登录设备指纹以及设备详细信息,后端存储采用的是Hbase,第一版本的服务操作Hbase数据的时候采用的是官方的API,上线后经大家反馈有如下问题:
- 运维维护的Hbase实例是通过Phoenix做数据管理的
- 大数据相关的需求也是通过SQL完成的
- Hbase原生的数据读写API不是很友好
于是决定采用Phoenix的API改写设备指纹系统
步骤
添加依赖
<dependency>
<groupId>com.aliyun.phoenix</groupId>
<artifactId>ali-phoenix-queryserver-client</artifactId>
<version>5.2.1-HBase-2.x</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
配置数据源
在配置文件中增加数据源相关的配置
phoenix:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: org.apache.phoenix.queryserver.client.Driver
jdbc-url: jdbc:phoenix:thin:url=http://${host}:${port};serialization=PROTOBUF
@Configuration
@MapperScan(basePackages = "path.to.mapper.package", sqlSessionFactoryRef = "phoenixSqlSessionFactory")
@EnableTransactionManagement
public class PhoenixDataSourceConfig {
@Value("classpath:/mybatis-config.xml")
private Resource configLocation;
@Value("classpath:/mapper/*.xml")
private Resource[] mapperLocations;
@Bean("phoenixDataSource")
@ConfigurationProperties(prefix = "phoenix")
public DataSource getDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean("phoenixSqlSessionFactory")
public SqlSessionFactoryBean createSqlSessionFactoryBean(@Qualifier("phoenixDataSource") DataSource ds) {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(ds);
bean.setConfigLocation(configLocation);
bean.setMapperLocations(mapperLocations);
return bean;
}
@Bean("phoenixTxManager")
public PlatformTransactionManager txManager(@Qualifier("phoenixDataSource") DataSource ds) {
return new DataSourceTransactionManager(ds);
}
}
配置好数据源之后,就可以按照Mybatis的方式来对Hbase数据来进行CURD了
遇到的问题
phoenix
的插入SQL语法用的是upsert
,在写mapper xml
的时候对于插入方法需要定义为update
*ali-phoenix-queryserver-client
里面依赖的protobuf-java
版本太低需要exclude掉然后重新依赖