【问题标题】:Random access performance in HBase & block size in HDFSHBase 中的随机访问性能和 HDFS 中的块大小
【发布时间】:2012-09-18 07:55:25
【问题描述】:

HBase 可以使用 HDFS 作为后端分布式文件系统。但是,它们的默认块大小是完全不同的。 HBase 采用 64KB 作为默认块大小,而 HDFS 采用至少 64MB 作为默认块大小,至少比 HBase 大 1000 倍。

我了解 HBase 是为随机访问而设计的,因此较小的块大小会有所帮助。但是在 HBase 中访问一个 64K 的块时,还需要访问 HDFS 中的一个 64MB 的块吗?如果是真的,HBase 能否很好地处理极其随机的访问?

【问题讨论】:

    标签: hbase hdfs


    【解决方案1】:

    块用于 HDFS 和 HBase 中的不同事物。 HDFS 中的块是磁盘上的存储单元。 HBase 中的块是内存的存储单元。有许多 HBase 块适合单个 HBase 文件。 HBase 旨在最大限度地提高 HDFS 文件系统的效率,并充分利用那里的块大小。有些人甚至将他们的 HDFS 调整为具有 20GB 块大小,以提高 HBase 的效率。

    阅读更多内容以了解 HBase 幕后发生的事情的一个地方是:http://hbase.apache.org/book.html#regionserver.arch

    如果您对比内存大得多的表进行完全随机访问,那么 HBase 缓存将无济于事。但是,由于 HBase 在存储和检索数据方面是智能的,因此它不需要从 HDFS 读取整个文件块来获取请求所需的数据。数据以key为索引,检索效率高。此外,如果您将密钥设计得很好,以便在整个集群中分配数据,随机读取将从每台服务器平均读取,从而最大限度地提高整体吞吐量。

    【讨论】:

      【解决方案2】:

      HBase

      HBase 将数据持久化到称为 HFiles 的大文件中,这些文件的大小很大(数百 MB 或 GB 左右的数量级)。

      当 HBase 想要读取时,它首先在 memstore 中检查数据是否在最近更新或插入的内存中,如果该数据不在内存中,它会发现 HFiles 具有可能包含数据的键范围你想要的(如果你运行压缩,只有 1 个文件)。

      一个 HFile 包含许多数据块(默认为 64kB 的 HBase 块),这些块很小以允许快速随机访问。并且在文件的末尾,有一个索引引用了所有这些块(带有块中的键范围和文件中块的偏移量)。

      当第一次读取 HFile 时,索引被加载并保存在内存中以供将来访问,然后:

      • HBase 在索引中执行二进制搜索(在内存中快速)以定位可能包含您请求的键的块
      • 一旦块被定位,HBase 可以要求文件系统在文件中的这个特定偏移处读取这个特定的 64k 块,从而导致单次磁盘寻道来加载您要检查的数据块。
      • 将在加载的 64k HBase 块中搜索您询问的键,如果存在则返回键值

      如果您的 HBase 块较小,执行随机访问时磁盘使用效率会更高,但会增加索引大小和内存需求。

      HDFS

      所有文件系统访问都由具有块(默认为 64MB)的 HDFS 执行。在 HDFS 中,块用于分发和数据本地化,这意味着 1GB 的文件将被拆分为 64MB 的块以进行分发和复制。这些块很大,因为要确保批处理时间不仅用于磁盘寻道,因为数据在该块中是连续的。

      结论

      HBase 块和 HDFS 块是不同的东西:

      • HBase 块是 HBase 中的索引单元(以及缓存和压缩),允许快速随机访问
      • HDFS 块是文件系统分布和数据局部性的单位

      与您的 HBase 参数和您的需求相比,HDFS 块大小的调整会对性能产生影响,但这是一个更微妙的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        • 2014-11-26
        • 1970-01-01
        相关资源
        最近更新 更多