您现在的位置是:首页 > 文章详情

Spring Boot 整合 HBase

日期:2018-11-29点击:650

一、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 等


二、HBase 安装


brew 一键安装即可:

brew install hbase

等安装好后,安装目录如下:

/usr/local/Cellar/hbase/1.2.6

/libexec/conf 是目录,在配置目录配置 JDK 环境如下:

vim libexec/conf/hbase-env.sh

配置 JAVA_HOME 到本机的 JDK 安装目录。


然后打开 hbase-site.xml 文件,里面是对应的两个文件目录:

// HBase 存储文件地方 file:///usr/local/var/hbase // ZooKeeper 存储文件地方 /usr/local/var/zookeeper

进入 bin ,里面是运行和关闭的 sh 脚本。 启动 HBase ,简单如下:

sudo ./start-hbase.sh

控制台中出现如下信息,说明启动 HBase 成功:

Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. starting master, logging to /usr/local/var/log/hbase/hbase-root-master-BYSocketdeMacBook-Pro-2.local.out Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0 Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0


三、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。





原文链接:https://blog.roncoo.com/article/134183
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章