HBase的存储文件合并(StoreFile Compaction)、Region Split

存储文件的合并(StoreFile Compaction)

  由于memstore每次刷写都会生成一个新的Hfile文件,那么当刷写的次数过多的时候就会产生大量的HFile小文件,我们知道,对于某一个字段的数据来说,它可能有多个版本的数据,这个版本是由时间戳决定的,那么可能在不同的时间对同一字段进行更新或者删除操作,这些不同版本的数据可能会分布在不同的地方,有的可能在磁盘中,有的可能还在内存,甚至可能分布在不同的HFile文件中,所以当我们客户端读数据的时候,会将block cache、内存以及磁盘一起读,如果HFile文件过多的话,会对HBase的读流程的速度影响非常的大。

  为了减少HFile文件的数量,提高读流程的性能,同时清理掉过期和删除的数据,会进行StoreFile Compaction操作。Compaction 分为两种,分别是Minor Compaction 和Major Compaction。Minor Compaction会将临近的若干个较小的HFile 合并成一个较大的HFile,但不会清理过期和删除的数据。Major Compaction 会将一个Store 下的所有的HFile 合并成一个大HFile,并且会清理掉过期和删除的数据。

  

   再进行合并操作之后,会生成一个大的文件,原先那些小的文件并不会立刻被删除掉,这是为了保证数据的一致性,所以会在等一段时间之后自动删除掉原先的小文件。

  由于Major Compaction需要将数据读出来然后合并重写,所以会十分地耗费资源,应该将系统的自动合并模式关掉,然后寻找合适的时间手动进行合并。下面这个属性就是个region进行 major compaction合并的周期,在这个点的时候, 这个region下的所有hfile会进行合并,默认是7天,建议关闭(设置为0)。

  注意,合并一定是同一个列族的文件之间进行合并,不同列族的文件都在不同的文件夹中。

Region Split

  默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region 会自动进行拆分。刚拆分时,两个子Region 都位于当前的Region Server,但处于负载均衡的考虑,HMaster 有可能会将某个Region 转移给其他的Region Server。

Region Split 时机:

  1.当1个region 中的某个Store 下所有StoreFile 的总大小超过hbase.hregion.max.filesize,该Region 就会进行拆分(0.94 版本之前)。

  2. 当1个region 中的某个Store 下所有StoreFile 的总大小超过Min(R^2 *"hbase.hregion.memstore.flush.size",hbase.hregion.max.filesize"),该Region 就会进行拆分,其中R为当前Region Server 中属于该Table 的个数(0.94 版本之后)。

原文地址:https://www.cnblogs.com/yxym2016/p/13495346.html