hdfs - HBase:Minor 和 Major Compaction 的区别

标签 hdfs hbase

我无法理解为什么主要压缩与次要压缩不同。据我所知,小压缩是将一些 HFile 合并为一个或多个 HFile。
而且我认为主要压缩几乎可以做同样的事情,除了处理已删除的行。
所以,我不知道为什么主要压缩会带回 HBase 的数据局部性(当它在 HDFS 上使用时)。
换句话说,为什么小压缩不能恢复数据局部性,尽管对我来说,小压缩和大压缩都只是将 HFile 合并到少量 HFile 中。
为什么只有主要压缩才能显着提高读取性能?我认为小压缩也有助于提高读取性能。
请帮我理解。
先感谢您。

最佳答案

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

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

  • 可以想象,由于重新启动和重新平衡,旧数据的位置较差的可能性更高。
    现在,理解小压缩和大压缩之间区别的简单方法如下:
    轻微压实 :这种压缩类型一直在运行,主要关注正在写入的新文件。由于是新的,这些文件很小,并且可以为旧文件中的数据提供删除标记。由于此压缩仅查看相对较新的文件,因此它不会触及/删除旧文件中的数据。这意味着在不同的压缩类型出现并删除旧数据之前,这种压缩类型即使从较新的文件中也无法删除删除标记,否则那些旧的已删除的 KeyValues 将再次可见。
    这导致两个结果:
  • 由于所接触的文件相对较新且较小,因此影响数据局部性的能力非常低。事实上,在写操作期间,区域服务器无论如何都会尝试在本地 HDFS 数据节点上写入数据的主要副本。因此,较小的压缩通常不会为数据局部性增加太多值(value)。
  • 由于没有删除删除标记,因此仍然保留了一些性能。也就是说,次要压缩对于 HBase 读取性能至关重要,因为它们可以控制总文件数,这可能是一个很大的性能瓶颈,尤其是在旋转磁盘上如果不加检查。

  • 主要压实 :这种类型的压缩很少运行(默认情况下每周一次)并且专注于完全清理存储(一个区域内的一个列族)。主要压缩的输出是一个存储的一个文件。由于主要压缩会重写存储中的所有数据,因此它可以删除删除标记和被这些删除标记标记为已删除的旧键值。
    这也导致了两个结果:
  • 由于删除标记和已删除数据被物理删除,文件大小显着减小,特别是在接收大量删除操作的系统中。这可能会导致大量删除环境中的性能显着提高。
  • 由于存储的所有数据都被重写,因此有机会恢复较旧(和较大)文件的数据位置,并且如前所述,由于重新启动和重新平衡可能会发生漂移。这导致读取期间更好的 IO 性能。

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

    关于hdfs - HBase:Minor 和 Major Compaction 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63650713/

    相关文章:

    hadoop - HDFS是否在Hadoop的键值存储之上实现?怎么样?

    hadoop - Hadoop访问控制异常:权限

    python - 将 HDFS(Hadoop 文件系统)目录中的文件读入 Pandas 数据帧

    python - 如何使用 hbase 作为 hadoop 流作业的源

    java - 如何附加到极小集群(3 个节点或更少)上的 hdfs 文件

    hadoop - 启动 Pig 给出错误名称节点处于安全模式

    hadoop - 使用Oozie在hbase上创建hive表导致libthrift出错?

    hadoop - 我们可以在Cloudera Hadoop集群中将hbase.rpc.protection属性值设置为none吗?如果是,那怎么办?

    python - spark/pyspark 与 HBase 的集成

    apache-spark - 在 Spark Streaming 中读取 Hbase 数据