首页 > 其他分享 >Spring Boot 整合 HBase

Spring Boot 整合 HBase

时间:2022-11-14 09:37:33浏览次数:46  
标签:hbase name Spring Bytes Boot new HBase public

HBase 介绍

HBase是一个分布式的、面向列的开源数据库,Hadoop 数据库。搭建基于 Hadoop 和 ZK 。

历史是基于 Google 的 Bigtable 、Google 文件系统等论文。HBase 在Hadoop 之上提供了类似于 Bigtable 的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

HBase 特性:

  • 大:一个表可以有数十亿行,上百万列, PB级别的水平扩展能力
  • 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要- - 动态的增加,同一张表中不同的行可以有截然不同的列
  • 稀疏:空列不占用存储空间,表可以很稀疏
  • 可靠性高:系统无单点,容忍任意两台物理节点故障,数据无风险
  • 数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳

HBase 适用场景:

  • 海量数据场景,天然支持数据水平扩展,处理 TB 到 PB 数据
  • 写性能突出,轻松打满网卡,增量数据抓取、批处理
  • 源于Hadoop生态,和hadoop生态各个大数据系统天然集成

HBase 运行模式

  • 单机
  • 伪分布式
  • 分布式

实战小提示:如果 DB 数据大,想要同步到 HBase 怎么做?用数据同步工具:DataX、binlog 等

Spring Boot 整合 HBase

在 pom.xml 文件中加入对应的依赖:

<dependency>
      <groupId>com.spring4all</groupId>
      <artifactId>spring-boot-starter-hbase</artifactId>
      <version>${spring-boot-habse}</version>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
        </exclusion>
      </exclusions>
</dependency>

需要解决日志包依赖冲突,所以排除日志相关依赖包

在 application.properties 添加对应的 HBase 配置:

## HBase 数据源配置
spring.data.hbase.quorum=127.0.0.1:2181
spring.data.hbase.rootDir=/hbase
spring.data.hbase.nodeParent=

nodeParent 适用于集群,目前是单机模式,不需要配置。

创建一个 Dto 对象:

public class PeopleDto {

    private String name;

    private int age;

    public String getName() {
        return name;
    }

    public PeopleDto setName(String name) {
        this.name = name;
        return this;
    }

    public int getAge() {
        return age;
    }

    public PeopleDto setAge(int age) {
        this.age = age;
        return this;
    }
}

定义该对象的 RowMapper:

import com.jthink.skyeye.data.hbase.api.RowMapper;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;

public class PeopleRowMapper implements RowMapper<PeopleDto> {

    private static byte[] COLUMNFAMILY = "f".getBytes();
    private static byte[] NAME = "name".getBytes();
    private static byte[] AGE = "age".getBytes();

    @Override
    public PeopleDto mapRow(Result result, int rowNum) throws Exception {
        PeopleDto dto = new PeopleDto();
        // TODO: 设置相关的属性值
        String name = Bytes.toString(result.getValue(COLUMNFAMILY, NAME));
        int age = Bytes.toInt(result.getValue(COLUMNFAMILY, AGE));

        return dto.setName(name).setAge(age);
    }
}

CRUD 服务层操作:

@Service
public class QueryService {

    @Autowired
    private HbaseTemplate hbaseTemplate;

    public List<PeopleDto> query(String startRow, String stopRow) {
        Scan scan = new Scan(Bytes.toBytes(startRow), Bytes.toBytes(stopRow));
        scan.setCaching(5000);
        List<PeopleDto> dtos = this.hbaseTemplate.find("people_table", scan, new PeopleRowMapper());
        return dtos;
    }

    public PeopleDto query(String row) {
        PeopleDto dto = this.hbaseTemplate.get("people_table", row, new PeopleRowMapper());
        return dto;
    }

    public void saveOrUpdates() {
        List<Mutation> puts = new ArrayList<>();
        // 设值
        this.hbaseTemplate.saveOrUpdates("people_table", puts);
    }

    public void saveOrUpdate() {
        Mutation delete = new Delete(Bytes.toBytes(""));
        this.hbaseTemplate.saveOrUpdate("people_table", delete);
    }

    public void saveOrUpdate() {
        List<Mutation> saveOrUpdates = new ArrayList<>();
        Put put = new Put(Bytes.toBytes("135xxxxxx"));
        put.addColumn(Bytes.toBytes("people"), Bytes.toBytes("name"), Bytes.toBytes("JThink"));
        saveOrUpdates.add(put);

        Delete delete = new Delete(Bytes.toBytes("136xxxxxx"));
        saveOrUpdates.add(delete);

        // 继续add

        this.hbaseTemplate.saveOrUpdates("people_table", saveOrUpdates);
    }
}

小结

在实践演进中,不可能一下次就用上高大上的 HBase。所以,同步数据这块强烈推荐 DataX。

标签:hbase,name,Spring,Bytes,Boot,new,HBase,public
From: https://www.cnblogs.com/java-six/p/16888015.html

相关文章