HBase是一个分布式的、面向列的数据库,它可以存储海量的结构化或半结构化的数据。HBase是基于Hadoop文件系统(HDFS)构建的,因此它也继承了HDFS的高可靠性、高扩展性和低成本的特点。但是,HBase并不直接使用HDFS的文件格式,而是定义了自己的物理存储单元——HFile。
HFile是HBase中最小的存储单元,它是一个有序的、不可变的、压缩的二进制文件,它包含了一系列的键值对(key-value pair)。每个键值对都由行键(row key)、列族(column family)、列限定符(column qualifier)、时间戳(timestamp)和值(value)组成。HFile中的键值对按照行键和时间戳的字典序排列,这样可以方便地进行范围查询和版本控制。
HFile的结构如下图所示:
从图中可以看出,HFile由以下几个部分组成:
1.文件头(File Header):包含了文件的元数据信息,如版本号、压缩算法、校验和类型等。
2.数据块(Data Block):包含了实际的键值对数据,每个数据块都有一个固定的大小(默认为64KB),并且可以被压缩和加密。数据块之间有一个分隔符(Delimiter),用于标识数据块的边界。
3.块索引(Block Index):包含了每个数据块的起始键和结束键,以及数据块在文件中的偏移量和大小。块索引可以加快查找数据块的速度,避免全文件扫描。
4.布隆过滤器(Bloom Filter):包含了文件中所有键值对的行键或列限定符的哈希值,用于判断某个键是否存在于文件中。布隆过滤器可以减少不必要的磁盘读取,提高查询效率。
5.尾部(Trailer):包含了块索引和布隆过滤器在文件中的偏移量和大小,以及一个魔数(Magic Number),用于标识文件的结束。
HFile具有以下几个特点:
1.HFile是不可变的,也就是说,一旦写入磁盘,就不能再修改或删除。这样可以保证数据的一致性和完整性,也可以避免并发写入时产生锁竞争。
2.HFile是有序的,也就是说,文件中的键值对按照一定的规则排序。这样可以利用二分查找等算法快速定位到目标数据块,并且可以支持范围查询等操作。
3.HFile是压缩的,也就是说,文件中的数据块可以使用不同的压缩算法进行压缩,以减少磁盘空间占用和网络传输开销。HBase支持多种压缩算法,如GZIP、LZO、Snappy、LZ4等。
4.HFile是可合并的,也就是说,多个小文件可以合并成一个大文件,以减少文件数量和元数据开销。HBase有一个后台进程叫做合并(Compaction),它会定期地对HFile进行合并操作,以提高读写性能。
HFile是HBase的物理存储单元,它是HBase实现高效存储和查询的基础。