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

12

HBase可以使用HDFS作为后端分布式文件系统。然而,它们的默认块大小有很大区别。HBase采用64KB作为默认块大小,而HDFS采用至少64MB作为默认块大小,这至少比HBase大1000倍。

我知道HBase是为随机访问设计的,所以较小的块大小很有帮助。但当在HBase中访问一个64K块时,是否仍需要访问一个64MB的HDFS块呢?如果是这样,HBase能够处理极端的随机访问吗?

2个回答

9

HDFS和HBase中的块用于不同的目的。在HDFS中,块是磁盘上的存储单元。在HBase中,块是内存的存储单位。许多HBase块适合存储在单个HBase文件中。HBase旨在从HDFS文件系统中最大化效率,并充分利用那里的块大小。一些人甚至调整了他们的HDFS以使用20GB块大小来使HBase更加高效。

要了解HBase后台的操作,请阅读以下链接:http://hbase.apache.org/book.html#regionserver.arch

如果您对一个比内存大得多的表进行了完全随机访问,则HBase缓存将无法帮助您。但是,由于HBase在存储和检索数据方面非常智能,它不需要从HDFS读取整个文件块来获取所需请求的数据。数据通过键进行索引,并且检索效率很高。此外,如果您设计好了用于在群集中分布数据的键,则随机读取将从每个服务器平等读取数据,从而最大化整体吞吐量。


8

HBase

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

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

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

首次读取HFile时,索引会被加载并保存在内存中,然后:

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

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

HDFS

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

结论

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

  • HBase块是HBase中索引(以及缓存和压缩)的单位,可实现快速随机访问
  • HDFS块是文件系统分发和数据本地化的单位

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接