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。

若存储的文件不具备唯一性,则需要根据存储容量评估可存储的版本数。

查看原文