HBase表数据倾斜治理_HFile结构与Snapshot结构
1.HFile结构
1.1 HFile逻辑结构
hfile v2在逻辑上的结构主要分为四个部分:
- 扫描时会被读取的部分;
- 扫描时不会被读取的部分;
- regionserver启动时会被加载到内存中的部分;
- 尾部:主要记录hfile的版本信息、各部分的offset。

1.2 HFile物理结构
hfile在物理存储上被切分成一个个大小相等的block块,block块的大小可以在建表时通过参数blocksize设置,默认是64kb。

组成hfile的block块的种类主要有8种,每种block块中保存不同种类的信息,但是每种block的物理结构都相同,如下图。

这8种block的简介如下,不同种类的block主要是blockdata内部结构不同,有的存储用户数据,有的存储索引数据等。

1.3 Trailer Block
读取某个hfile的步骤:
- 首先读取version版本信息到内存,根据version版本信息确定trailer的长度;
- 读取trailer block到内存,获取LoadOnOpen区域的起点和终点偏移量;
- 读取LoadOnOpen区域数据到内存,接下来就可以根据布隆过滤器和索引直接定位目标数据block块。
1.4 BloomFilter Meta Block & Bloom Block
布隆过滤器用于帮助get操作和scan操作剔除不会用到的hfile文件,减少实际IO次数,提高随机读性能。
根据rowkey进行查询时,首先将布隆过滤器函数及为位数组block加载进内存,然后进行hash映射,如果对应数组位上存在0,则说明该hfile中不存在该rowkey,不用进行后续数据加载。
1.5 hbase命令查看hfile
在hbase配置环境下可以直接使用hbase语法解析查看hfile文件。语法如下:
1 | hbase org.apache.hadoop.hbase.io.hfile.HFile -f hfile的hdfs存储路径 -e -p -m -s |
应用实例:
1 | E:\HBase\hbase\bin>hbase org.apache.hadoop.hbase.io.hfile.HFile -f hdfs://localhost:9005/hbase/data/default/fellowjava/674dcf9d985c1c583ab5a4a0b23f7a37/d/7790adf6cac8430e8b12b8017ef9b67b -e -p -m -s |
2.Snapshot结构
2.1 hbase表数据在hdfs当中的目录结构
1 | / {hbase.rootdir} |

- 说明:
{}当中表示文件名可变,/表示文件夹,*表示文件。其中各级目录当中还有很多.tmp临时文件夹,用于进行数据操作时临时存放,变更完成后都会变成空文件夹。 - {hbase.rootdir}在hbase-site.xml文件中定义,一般是{fs.default.name}+”/hbase”。
- {namespace}为表的命令空间,如果创建表时没有指定命令空间,则自动设置命名空间为default。
- {tablename}为表名。
- .tableinfo.0000000001文件中以字节码的形式保存着表名、列族等表基本信息。
- {region1 name}为表的region名。表按照rowkey不同按行分割存储成不同的region存储到不同的regionserver中。
- .regioninfo文件中以字节码的形式保存着region的基本信息和其中所有hfile的地址链接。
- {columns family}为列族名,同一个region中的数据按列族分隔存储在不同的store当中。
- {hfile1 name}当中存储真实数据。

2.2 snapshot在hdfs当中的目录结构
1 | / {hbase.rootdir} |

- .snapshotinfo当中保存了表名等基本信息。
- data.manifest是源hbase表当中所有.regioninfo的集合,保存了每个region下所有hfile文件的地址链接(link)。
2.3 archive文件夹的目录结构
1 | / {hbase.rootdir} |

snapshot其实就是源表数据文件的指针,对snapshot的take、clone、restore、delete等操作并不会涉及到数据文件本身。
但是当源表数据发生flush、compact的变化或者被删除时,首先会检测是否存在snapshot文件指向该数据文件,如果存在则会先将该源表数据文件复制到archive文件夹中。后续对于snapshot的数据操作都是使用archive文件夹中的数据。
snapshot的export操作同样是先将源表数据文件全部复制到archive文件夹中再导出到目标地址。所以完成export操作之后,导出目标地址上会有两个文件夹,分别是.hbase-snapshot和archive,依靠这两个文件夹就可以完全还原出源表。