1 整体存储方案
由于项目所有的文件数据都会存放到HBase表格中,数据量较大,因此采用按时间分表的方式,将不同时间段的数据存放到不同的表格中。
2 分表策略
因项目增量较大,日增约600GB,一年数据量约为200TB,因此采用按年分表,每年的数据放置在一张HBase表格中。每到新的一年开始,新建一张表格,存储下一年的数据。表格命名规则如下:
表格名称+年份,例如historyfile_2022。
3 表结构设计
3.1 Rowkey设计
Rowkey采用加盐+文件路径的方式。使用文件路径,是因为查询的时候需要使用文件路径进行定位。如果不做加盐,部分路径的数据量会特别大,导致出现热点region问题,因此还需要采用加盐。
加盐,通过在主键之前加上部分的hash值。场景的实现方式为key.hashcode%regionNum+key。这样可以把记录相对比较均匀的打散到每个region。
3.2 Rowkey全局唯一性
由于每份文件都不同,需要确保Rowkey全局唯一,即文件路径需要全局唯一。如果Rowkey相同。默认情况下HBase会重复写入,并且保存为较新的版本,默认有3个版本(后面第4章会提到)。
应用层面实现全局唯一,可以通过如下逻辑实现:
- 如果是数据写入,首先获取对应key的内容
- 如果没有对应记录,则尝试写入
- 如果存在,则写入失败。
3.3 Column Family设计
HBase表格每条记录可以分为如下几个部分:
- Rowkey:全局唯一的主键
- Cloumn Family:可以有多个,一个Column Family可以办好多个列
- Column:一列。
- 不同的行可以有不同的Column Family和Column。
列族/列 | 名称 | 含义 | MOB启用 |
列族 | f | ||
列 | c | 存放文件数据 | 是 |
3.4 Mob功能
Mob(HBase Medium Object Storage)功能,主要用于优化中等文件(100k到10M)在Hbase中的读写延迟,以及随机访问的能力。该功能使得HBase能够比较好的读写中等大小的文件头,例如文档,图片,音频等。
HBase默认的读写机制,在读写中等文件时,会出现延迟非常不均匀的情况。Mob功能的实现修复了这个问题。MOB通过使用额外的存储路径来存放这些文件,并且采用了全新的compaction机制。MOB文件存储的路径,称为MOB region,一开始存入MOB region的文件,会随着写入的增多,文件数不断增多,通过compaction机制,MOB文件会进行合并。默认合并的机制,是同一个region下,同一天的数据会合并成一个文件。也就是说,一个region目录下,一年会有365个文件。如果表格有1000个region,那么一年将会产生365*1000个文件。
MOB功能可以对Column Family级别设置启用,启用后通过MOB_THRESHOLD参数来设置记录是否会被存放到MOB。如果记录大小超过MOB_THRESHOLD则会写入MOB,否则会按正常路径存放。
3.5 Region个数
HBase的一张表格会划分成多个region, 每个region负责存储一部分数据。Region的个数,在使用MOB功能的情况下,需要根据以下两个因素去考虑:
- 表格的数据量
- 产生的文件数
本次采用分表的策略,一年的数据,存放在一张表格。因此,集群HBase,所有的数据量为单张HBase表格*年数,产生的文件数为单张HBase表格*10。
上一章节中描述使用MOB功能后,Hbase表格文件数为region数*365*年数。
按需求的推算,一年将近有200TB数据,每天约有600GB数据。如果单张表使用200个region,则每个region平均为1TB数据,且每天的MOB文件数大小约为2.75GB。相对比较合理。
因此建议,1年的数据使用200个region。
4 HBase记录版本设置
HBase每条记录可以保存多个版本,也就是同一个Rowkey 的同一个列可以写入多个版本的记录。HBase支持获取这些版本的值。
若所有文件具有唯一性,不存在一份文件有多个版本的情况。只需要记录一个版本就行。因此对于具有唯一性的文件建议将HBase记录的版本数设置为1。
若存储的文件不具备唯一性,则需要根据存储容量评估可存储的版本数。