SpringBoot 连接Hbase实现上传下载文件的功能
Hbase简介
HBase 是Google Bigtable 的开源实现,构建在HDFS之上,适用于实时读写,随机访问超大规模数据集的情形。
到目前为止,存在许多数据存储和访问的方案。事实上,大多数解决方案,特别是关系型数据库,在构建时并没有考虑超大规模和分布式的特点。许多商家通过复制和分区的方法来扩充数据库使其突破单个节点的界限,增加了安装和维护的复杂性,影响了RDBMS的特定功能(例如,联接、复杂的查询、触发器、视图和外键约束)。
HBase从另一个角度来处理伸缩性问题。它通过线性方式从下到上增加节点来进行扩展。HBase是非关系型数据库,巧妙地将大而稀疏的表放在商用的服务器集群上,其特点如下:
- 大:一个表可以存上亿行几百万列数据。
- 面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索。
- 稀疏:对于为空(NULL)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
- 无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。
- 数据多版本:每个单元中的数据可以有多个版本,默认情况下,版本号自动分配,版本号就是单元格插入时的时间戳。
- 数据类型单一:HBase中的数据都是字符串,没有类型。
Hbase使用实例
依托一个实际的开发任务介绍SpringBoot连接Hbase的方式
开发任务
将大量小文件存放在Hbase中,方便后期下载、根据文件类型和时间段查询文件。
行键设计
行键是Hbase中特别重要的概念,是用来检索记录的主键,其设计原则一般如下:
- 长度:不要超过16个字节。
- 散列:大量连续或者相似的行键容易造成“热点”问题。
- 唯一性: 必须在设计上保证行键的唯一性。行键是按照字典顺序排序存储的,因此,在设计行键的时候,要充分利用这个排序特点,将经常读取或者可能一块被访问的数据存储到一块。
本文考虑后期需求,行键中包含3个元素:文件类型、存放时间和UUID(本文重点在于连接Hbase,Hbase的相关概念不在本文的范围内,不了解的同学可以参考网上的其它资料,这里不做过多阐述)。
代码实现
在给出具体代码之前,贴出最重要的依赖信息:
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.4.6</version>
</dependency>
具体的代码如下:
@RestController
public class FileProcessor {
//the object is used to configurate Hbase
private Configuration configurationHbase;
//this object is a Communicator to hbase
private Connection connectionHbase;
//the name of table that save information of files
private static final String TABLENAM