work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Spring Boot集成HBase

Posted on 2020-05-31 15:12  work hard work smart  阅读(1099)  评论(0编辑  收藏  举报

Spring Boot版本v1.5.19.RELEASE

1、增加Jar

		<dependency>
			<groupId>com.spring4all</groupId>
			<artifactId>spring-boot-starter-hbase</artifactId>
			<version>1.0.0.RELEASE</version>
		</dependency>

  

2、创建表

创建命名空间pb

create_namespace 'pb'

  

在pb命名空间下创建用户表

create 'pb:user', {NAME => 'b', VERSIONS => '3', TTL => '2147483647', 'BLOOMFILTER' => 'ROW'}, {NAME => 'o', VERSIONS => '3', TTL => '2147483647', 'BLOOMFILTER' => 'ROW'}

 user表下有b和o列族

 

3、配置参数。

主要是hbase的配置。程序的部署环境和hbase的部署环境是同一台linux服务器。

spring:
  application:
    name: hbaseDemo
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: mygroup
    listener:
      concurrency: 4
  data:
    hbase:
      quorum: localhost:2181
      rootDir: hdfs://localhost:9000/hbase
      nodeParent: /hbase
  redis:
    host: 127.0.0.1
    port: 6379

server:
  port: 8080

logging:
  file:hbaseDemo.log
  level: debug

  

4、实现访问HBase数据库的关键代码

1) 基本信息

用户信息User。包括用户基本信息BaseInfo 和其它信息OtherInfo 

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    /** 用户 id */
    private Long id;

    /** 用户基本信息 */
    private BaseInfo baseInfo;

    /** 用户额外信息 */
    private OtherInfo otherInfo;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class BaseInfo {

        private String name;
        private Integer age;
        private String sex;
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class OtherInfo {

        private String phone;
        private String address;
    }
} 

用户表结构常量。代表Hbase的表结构,表名为pb:user,列族分别为列族基本信息b和列族其它信息o。

列族基本信息b包括列字段name,列字段age,列字段age

列族其它信息o包括列字段phone和列字段address

 

 public class UserTable {

        /** User HBase 表名 */
        public static final String TABLE_NAME = "pb:user";

        /** 基本信息列族 */
        public static final String FAMILY_B = "b";

        /** 用户名 */
        public static final String NAME = "name";

        /** 用户年龄 */
        public static final String AGE = "age";

        /** 用户性别 */
        public static final String SEX = "sex";

        /** 额外信息列族 */
        public static final String FAMILY_O = "o";

        /** 电话号码 */
        public static final String PHONE = "phone";

        /** 住址 */
        public static final String ADDRESS = "address";
    }

  

 

 

2)Controller层代码

直接调用服务层的创建用户

    @ResponseBody
    @PostMapping("/createuser")
    Response createUser(@RequestBody User user) throws Exception {
        return userService.createUser(user);
    }

  

 

3)服务层代码

Hbase客户端

   /** HBase 客户端 */
    private final HbaseTemplate hbaseTemplate;

    /** redis 客户端 */
    private final StringRedisTemplate redisTemplate;

    @Autowired
    public UserServiceImpl(HbaseTemplate hbaseTemplate, StringRedisTemplate redisTemplate) {
        this.hbaseTemplate = hbaseTemplate;
        this.redisTemplate = redisTemplate;
    }

 保存用户信息 

    @Override
    public Response createUser(User user) throws Exception {

        byte[] FAMILY_B = Constants.UserTable.FAMILY_B.getBytes();
        byte[] NAME = Constants.UserTable.NAME.getBytes();
        byte[] AGE = Constants.UserTable.AGE.getBytes();
        byte[] SEX = Constants.UserTable.SEX.getBytes();

        byte[] FAMILY_O = Constants.UserTable.FAMILY_O.getBytes();
        byte[] PHONE = Constants.UserTable.PHONE.getBytes();
        byte[] ADDRESS = Constants.UserTable.ADDRESS.getBytes();

        //Long curCount = redisTemplate.opsForValue().increment(Constants.USE_COUNT_REDIS_KEY, 1);
        Long userId = genUserId(++curCount);

        List<Mutation> datas = new ArrayList<Mutation>();
        Put put = new Put(Bytes.toBytes(userId));

        put.addColumn(FAMILY_B, NAME, Bytes.toBytes(user.getBaseInfo().getName()));
        put.addColumn(FAMILY_B, AGE, Bytes.toBytes(user.getBaseInfo().getAge()));
        put.addColumn(FAMILY_B, SEX, Bytes.toBytes(user.getBaseInfo().getSex()));

        put.addColumn(FAMILY_O, PHONE, Bytes.toBytes(user.getOtherInfo().getPhone()));
        put.addColumn(FAMILY_O, ADDRESS, Bytes.toBytes(user.getOtherInfo().getAddress()));

        datas.add(put);

        hbaseTemplate.saveOrUpdates(Constants.UserTable.TABLE_NAME, datas);

        user.setId(userId);

        return new Response(user);
    }

  

4) 使用接口调用

JSON格式

{
        "baseInfo": {
            "name": "nick",
            "age": 100,
            "sex": "m"
        },
        "otherInfo": {
            "phone": "18966668888",
            "address": "shanghai"
        }    }

  

 

 

 5) 查看HBase 表中创建的用户

scan pb:user