HBase可以使用HDFS作为后端分布式文件系统。但是,它们的默认块大小完全不同。 HBase采用64KB作为默认块大小,而HDFS采用至少64MB作为默认块大小,至少比HBase大1000倍。
我知道HBase是为随机访问而设计的,因此较小的块大小很有帮助。但是当访问HBase中的64K块时,是否仍然需要访问HDFS中的一个64MB块?如果是真的,HBase可以很好地处理非常随机的访问吗?
答案 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将数据保存到名为HFiles的大型文件中,这些文件大小很大(数百MB的数量级,或大约GB)。
当HBase想要读取时,它首先在memstore中检查数据是否来自最近的更新或插入的内存,如果该数据不在内存中,它将发现具有一系列可能包含数据的键的HFile你想要的(如果你运行压缩,只有一个文件)。
HFile包含许多数据块(默认情况下为64kB的HBase块),这些块很小,可以进行快速随机访问。在文件的末尾,有一个索引引用所有这些块(块中的键范围和文件中块的偏移量。)
首次读取HFile时,索引会被加载并保存在内存中以供将来访问,然后:
如果你有小的HBase块,你在执行随机访问时会有更高效的磁盘使用率,但它会增加索引大小和内存需求。
所有文件系统访问都由具有块的HDFS执行(默认为64MB)。在HDFS中,块用于分发和数据位置,这意味着1GB的文件将以64MB块的形式分割以进行分发和复制。这些块很大,因为确保批处理时间不仅用于磁盘搜索,因为数据在该块中是连续的。
HBase块和HDFS块是不同的东西:
与HBase参数和您的需求相比,调整HDFS块大小会对性能产生影响,但这是一个更微妙的问题。