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



HBase可以使用HDFS作为后端分布式文件系统。然而,它们的默认块大小却大不相同。HBase采用64KB作为默认块大小,而HDFS采用至少64MB作为默认块尺寸,这至少是HBase的1000倍。

我知道HBase是为随机访问而设计的,所以较低的块大小是有帮助的。但是当访问HBase中的64K块时,是否仍然需要访问HDFS中的64MB块?如果这是真的,HBase能很好地处理极端随机访问吗?

块用于HDFS和HBase中的不同用途。HDFS中的块是磁盘上的存储单元。HBase中的块是存储器的一个存储单元。有许多HBase块可以放入一个HBase文件中。HBase的设计是为了最大限度地提高HDFS文件系统的效率,并且它们完全利用了那里的块大小。有些人甚至将HDFS调整为20GB的块大小,以提高HBase的效率。

有一个地方可以阅读更多内容来了解HBase的幕后情况:http://hbase.apache.org/book.html#regionserver.arch

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

HBase

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

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

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

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

  • HBase在索引中执行二进制搜索(在内存中快速搜索),以定位可能包含您要求的密钥的块
  • 一旦找到块,HBase就可以要求文件系统在文件中的这个特定偏移量读取这个特定的64k块,从而产生一个单磁盘寻道来加载您想要检查的数据块
  • 加载的64k HBase块将搜索您要求的密钥,如果存在,则返回密钥值

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

HDFS

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

结论

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

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

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

最新更新