HBase 是一个分布式的、面向列的 NoSQL 数据库,它可以存储海量的结构化或半结构化的数据。HBase 的数据模型是由表、行、列族和单元格组成的,其中单元格是最小的数据单元,它包含一个行键、一个列限定符、一个时间戳和一个值。HBase 的数据是按照行键的字典序排列的,这样可以方便地进行范围查询和扫描操作。
HBase 的数据是存储在 HDFS 上的,HDFS 是一个分布式的文件系统,它可以提供高可用性、高容错性和高吞吐量的特性。HBase 的每个表都对应着一个 HDFS 目录,每个列族都对应着一个子目录。HBase 的文件格式是 HFile,它是一种基于块的二进制文件格式,它可以支持随机读写和顺序读写。
HFile 的结构如下图所示:
HFile 由多个块组成,每个块都有一个固定的大小(默认为 64KB),每个块都包含一组有序的键值对(即单元格)。每个块都有一个校验和和一个压缩类型,用于保证数据的完整性和节省存储空间。每个块都有一个索引项,用于记录块的偏移量和长度,以及块中第一个键值对的键。所有的索引项组成了块索引,它位于 HFile 的末尾。块索引可以加速查找某个键值对所在的块,从而实现随机读取。
除了块索引之外,HFile 还包含了一些元数据信息,比如文件信息、统计信息和尾部魔数等。文件信息包含了一些键值对,用于记录 HFile 的属性,比如版本号、创建时间、压缩算法等。统计信息包含了一些统计数据,比如最小键、最大键、平均键长度、平均值长度等。尾部魔数是一个固定的字节序列,用于标识 HFile 的结束位置。
HFile 是 HBase 的核心文件格式,它可以有效地存储和管理 HBase 的数据。通过了解 HFile 的结构和特点,我们可以更好地理解 HBase 的存储原理和优化策略。