HBase:次要压缩和主要压缩之间的区别

H.P*_*ter 4 hbase hdfs

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

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

所以,我不知道为什么主要压缩会恢复 HBase 的数据局部性(当它在 HDFS 上使用时)。

换句话说,为什么小压缩不能恢复数据局部性,尽管对我来说,小压缩和大压缩都只是将 HFile 合并成少量的 HFile。

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

请帮助我理解。

先感谢您。

Ash*_*uri 7

在了解主要压缩和次要压缩的区别之前,需要从压缩的角度了解影响性能的因素:

  1. 文件数量:由于文件元数据和与每个文件相关的查找成本,太多文件会对性能产生负面影响。
  2. 数据量:数据太多意味着性能下降。现在,这些数据可能有用也可能无用,即主要由 HBase 所谓的“删除标记”组成。HBase 使用这些删除标记将旧Hfile中可能包含的Cell/KeyValue标记为已删除。
  3. 数据局部性:由于HBase RegionServer是无状态进程,并且数据实际上存储在HDFS中,因此Region Server服务的数据可能位于不同的物理机器上。同一台机器上有多少区域服务器的数据计入数据局部性。在写入数据时,regionserver尝试将数据的主副本写入本地HDFS数据节点。因此,集群的数据局部性为 100% 或 1。但是,由于 Regionserver 重新启动、区域重新平衡或区域分割,区域可能会移动到与最初启动时不同的计算机,从而降低局部性。更高的局部性意味着更好的 IO 性能,因为 HBase 可以使用称为短路读取的功能。

正如您可以想象的那样,由于重新启动和重新平衡,旧数据的位置较差的可能性会更高。

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

次要压缩:这种压缩类型始终运行,主要关注正在写入的新文件。由于是新文件,这些文件很小,并且可以对旧文件中的数据进行删除标记。由于此压缩仅查看相对较新的文件,因此它不会触及/删除旧文件中的数据。这意味着,在不同的压缩类型出现并删除较旧的数据之前,该压缩类型甚至无法从较新的文件中删除删除标记,否则那些较旧的已删除的 KeyValue将再次变得可见。

这会导致两个结果:

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

  2. 由于删除标记没有被删除,所以一些性能仍然留在桌面上。也就是说,较小的压缩对于 HBase 读取性能至关重要,因为它们可以控制文件总数,如果不加以控制,这可能会成为一个很大的性能瓶颈,尤其是在旋转磁盘上。

主要压缩:这种类型的压缩很少运行(默认情况下每周一次),重点是完全清理存储(一个区域内的一个列族)。主要压缩的输出是一个存储的一个文件。由于主要压缩会重写存储中的所有数据,因此它可以删除删除标记以及被这些删除标记标记为已删除的较旧的KeyValue

这也导致了两个结果:

  1. 由于删除标记和删除的数据被物理删除,因此文件大小显着减小,特别是在接收大量删除操作的系统中。这可以在删除频繁的环境中显着提高性能。

  2. 由于存储的所有数据都被重写,因此有机会恢复旧(和更大)文件的数据局部性,以及由于重新启动和重新平衡而可能发生漂移的情况,如前所述。这会在读取期间带来更好的 IO 性能。

有关 HBase 压缩的更多信息:HBase 书籍