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读取整个文件块即可获取请求所需的数据.数据按密钥索引,检索效率很高.此外,如果您已经设计好密钥以在群集中分发数据,则随机读取将从每个服务器均匀读取,从而最大限度地提高整体吞吐量.
小智 6
HBase将数据保存到名为HFiles的大型文件中,这些文件大小很大(数百MB的数量级,或大约GB).
当HBase想要读取时,它首先在memstore中检查数据是否来自最近的更新或插入的内存,如果该数据不在内存中,它将发现HFiles具有一系列可能包含您想要的数据的键(如果你运行压缩只有1个文件).
HFile包含许多数据块(默认情况下为64kB的HBase块),这些块很小,可以进行快速随机访问.在文件的末尾,有一个索引引用所有这些块(块中的键范围和文件中块的偏移量).
首次读取HFile时,会加载索引并保存在内存中以供将来访问,然后:
如果你有小的HBase块,你在执行随机访问时会有更高效的磁盘使用,但它会增加索引大小和内存需求.
所有文件系统访问都由具有块的HDFS执行(默认为64MB).在HDFS中,块用于分发和数据位置,这意味着1GB的文件将以64MB块的形式分割以进行分发和复制.这些块很大,因为确保批处理时间不仅用于磁盘搜索,因为数据在该块中是连续的.
HBase块和HDFS块是不同的东西:
与HBase参数和您的需求相比,调整HDFS块大小会对性能产生影响,但这是一个更微妙的问题.