HBase中的随机访问性能& HDFS中的块大小

时间:2012-09-18 07:55:26

标签: hbase hdfs

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

我知道HBase是为随机访问而设计的,因此较小的块大小很有帮助。但是当访问HBase中的64K块时,是否仍然需要访问HDFS中的一个64MB块?如果是真的,HBase可以很好地处理非常随机的访问吗?

2 个答案:

答案 0 :(得分:9)

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

有一个地方可以阅读更多信息,了解HBase幕后发生的事情:http://hbase.apache.org/book.html#regionserver.arch

如果您对比内存大得多的表具有完全随机访问权限,那么HBase缓存将无法帮助您。但是,由于HBase在存储和检索数据方面非常智能,因此无需从HDFS读取整个文件块即可获取请求所需的数据。数据按密钥索引,检索效率很高。此外,如果您已经设计好密钥以在群集中分发数据,则随机读取将从每个服务器均匀读取,以便最大化整体吞吐量。

答案 1 :(得分:6)

HBase的

HBase将数据保存到名为HFiles的大型文件中,这些文件大小很大(数百MB的数量级,或大约GB)。

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

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

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

  • HBase在索引中执行二进制搜索(内存中快速)以找到可能包含您要求的密钥的块
  • 找到块后,HBase可以要求文件系统在文件中的此特定偏移处读取此特定的64k块,从而导致单个磁盘寻找加载要检查的数据块。
  • 将搜索加载的64k HBase块以查找您询问的密钥,并返回返回的密钥值

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

HDFS

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

结论

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

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

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