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

问题描述

我很难理解为什么大压缩与小压缩不同。据我所知,较小的压缩是将一些HFile合并为一个或多个HFile。

我认为除了处理已删除的行以外,大型压缩几乎可以完成相同的工作。

因此,我不知道为什么大型压缩会带回HBase的数据局部性(在HDFS上使用时)。

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

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

请帮助我理解

谢谢。

解决方法

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

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

您可以想象,由于重新启动和重新平衡,对于较旧数据而言,本地性较差的可能性更高。

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

次要压缩:这种压缩类型一直在运行,并且主要关注正在写入的新文件。由于这些文件是新文件,因此它们很小,并且可以为旧文件中的数据提供删除标记​​ em>。由于此压缩仅查看相对较新的文件,因此它不会触摸/删除较旧文件中的数据。这意味着,除非使用其他压缩类型并删除较旧的数据,否则该压缩类型甚至无法从较新的文件中删除删除标记​​ em>,否则将删除较旧的 KeyValues 将再次显示。

这导致两个结果:

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

  2. 由于未删除删除标记,因此表上仍保留一些性能。也就是说,较小的压缩对于HBase读取性能至关重要,因为它们可以控制文件总数,这可能是一个很大的性能瓶颈,尤其是如果不检查旋转磁盘,则可能是一个很大的瓶颈。

主要压缩:这种类型的压缩很少运行(默认情况下每周一次),并且专注于完全清理商店(一个区域内的一个列族)。主要压缩的输出是一个 store 的一个文件。由于主要压缩会重写 store 中的所有数据,因此它可以删除 delete标记和较旧的 KeyValues 标记为被这些删除标记​​ em>。

这还导致两个结果:

  1. 由于物理删除了删除标记​​ em>和已删除的数据,因此文件的大小显着减小,尤其是在接受大量删除操作的系统中。在大量删除的环境中,这可以大大提高性能。

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

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