众所周知,Apache HBase是一个分布式的基于于读性能优化的列式存储,读性能的优化来自于每个列簇对应一个文件。HBase最初思想来源于Google文件系统。
一个列簇对应一个文件的情况并不保证这样,尤其是在HBase频繁写的时候,因此HBase需要一种机制把HFiles合并以减少最大磁盘寻址开销以提高读性能。这个过程称为compaction。
Compaction有两方式:major compaction和minor compaction。
Minor Compactions:合并一系列小文件为一个大文件,合并的文件数目是可以配置的,也可以配置minor compaction的频率。Minor compactions十分重要,如果没有minor compactions,读固定的行需要很大磁盘读开销,造成性能问题。
Major Compactions:读取一个Region下面的所有Store files并写入到一个Store file。
每个HBase表有:
1 一或多个列簇:列分组,不同列在物理上隔离
2 一或多个region:类似于shards,代表一个行集
每个HBase表的每个列簇在一个region下面都有一个store,包括:
1 MemStore - 用于存储临时的修改的一个内存空间
2 0或多个Store files - 当MemStore填充满后会被创建,也称为HFiles
这些Store files都是不可变的,在每个MemStore flush的时候HBase会创建一个新的文件。Compaction的作用就是把一个Region下面的Store files合并成更少的Store files从而优化性能。
Minor compactions不会做任何删除动作,只是把一些小文件合并为更大的文件。只有Major compactions才会有删除的动作。除此之外,还有更多的compaction机制,在此不作详述。
如果是要合并所有的文件,推荐使用Major compactions,因为除了可以做Minor compactions能做的合并之外,还会删除无用的数据。
使用以下命令手动触发major compaction
major_compact "table_name"
当HBase积累很多HFile时而不做compaction,可以获得更好的写性能。相反,如果通知HBase做compaction,读性能则会更好。
HBase可以指定什么时候做compaction并指定最大HFiles文件个数来确保可以实现不错的读性能。
通常情况下,flush和compaction操作可以同时进行。