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