HBase:Difference 在次要和主要压实之间

HBase:Difference between Minor and Major Compaction

我无法理解为什么主要压缩与次要压缩不同。据我所知,minor compaction就是将一些HFiles合并成一个或多个HFiles。

而且我认为除了处理已删除的行之外,主要压缩几乎做同样的事情..

所以,我不知道为什么主要压缩会带回 HBase 的数据局部性(当它用于 HDFS 时)。

换句话说,为什么minor compaction不能恢复数据局部性,尽管对我来说,minor compaction和major compaction都只是将HFiles合并成少量的HFiles。

为什么只有主要压缩才能显着提高读取性能?我认为minor compaction也有助于提高读性能

请帮我理解。

提前致谢。

在了解major和minor compaction的区别之前,您需要从compactions的角度了解影响性能的因素:

  1. 文件数量:由于文件元数据和与每个文件相关的寻道成本,太多文件会对性能产生负面影响。
  2. 数据量:数据过多意味着性能下降。现在,这些数据可能有用也可能没用,即主要由 HBase 调用的 Delete markers 组成。 HBase 使用这些 删除标记 来标记 Cell/KeyValue 可能包含在较旧的 Hfile 已删除。
  3. Data locality:由于HBase regionserver是无状态进程,数据实际存储在HDFS中,region server服务的数据可能在不同的物理机上。同一台机器上有多少区域服务器的数据计入数据局部性。在写入数据时,regionserver 尝试在本地 HDFS 数据节点中写入数据的主要副本。因此,集群的数据局部性为 100% 或 1。但是,由于区域服务器重启或区域重新平衡或区域拆分,区域可以移动到与最初启动时不同的机器,从而减少局部性。更高的位置意味着更好的 IO 性能,因为 HBase 然后可以使用称为 short-circuit reads.
  4. 的东西

如您所想,由于重启和重新平衡,旧数据的局部性较差的可能性更高。

现在,理解次要压缩和主要压缩之间区别的简单方法如下:

次要压缩:这种压缩类型一直是运行,主要关注正在写入的新文件。由于是新文件,这些文件很小,可以对旧文件中的数据进行 删除标记 。由于此压缩仅查看相对较新的文件,因此它不会 touch/delete 来自旧文件的数据。这意味着在不同的压缩类型出现并删除旧数据之前,此压缩类型无法删除 delete 标记,即使是较新的文件,否则那些较旧的 deleted KeyValues 将再次可见。

这会导致两种结果:

  1. 由于被触及的文件相对较新较小,对数据局部性的影响能力很低。事实上,在写入操作期间,区域服务器无论如何都会尝试将数据的主要副本写入本地 HDFS 数据节点。因此,次要压缩通常不会为数据局部性增加太多价值。

  2. 由于没有删除删除标记,所以在table上还有一些表现。也就是说,次要压缩对于 HBase 读取性能至关重要,因为它们可以控制总文件数,如果不加以检查,这可能是一个很大的性能瓶颈,尤其是在旋转磁盘上。

Major Compaction:这种类型的压缩很少运行(默认情况下每周一次)并专注于完全清理 store(一个列族在一个地区)。主要压缩的输出是一个文件对应一个 store。由于主要压缩重写 store 中的所有数据,它可以删除 delete markers 和旧的 KeyValues 被那些 删除标记 .

标记为已删除

这也会导致两种结果:

  1. 由于删除标记和删除的数据被物理删除,文件大小显着减小,尤其是在接收大量删除操作的系统中。这可以显着提高 delete-heavy 环境中的性能。

  2. 由于 store 的所有数据都被重写,因此有机会恢复旧(和更大)文件的数据局部性,也可能发生漂移如前所述,由于重启和重新平衡而发生。这会导致读取期间更好的 IO 性能。

有关 HBase 压缩的更多信息:HBase Book