5

我是 HBase 的新手,但我已经设置并了解了有关 HBase 和 Hadoop 的一些知识。

当我研究 HBase MemStore 时,我对 MemStore 的所有理解是“MemStore 是 HBase 放置必须写入或读取的数据的内存位置”。所以,这就是为什么我们想在何时何地阅读有关 memstore 的内容,我们还会看到有关垃圾收集的讨论。

现在我的问题是 memstore 的唯一目的是在内存中保存可读和可写的数据吗?我们可以调整该内存的大小以从 hbase 获得快速回复吗?垃圾收集配置(收集器配置)会影响 memstore 吗?我认为应该是的。:)

4

2 回答 2

6

您对 Hbase Memstore 的看法是正确的。一般来说,当有东西写入 HBase 时,它​​首先被写入内存存储(memstore),一旦这个 memstore 达到一定的大小*,它就会被刷新到磁盘到存储文件中(所有内容也立即写入日志文件的耐久性)。

*从全局角度来看,HBase 默认使用 40% 的堆(参见属性 hbase.regionserver.global.memstore.upperLimit)用于所有表的所有列族的所有区域的所有 memstore。如果达到此限制,它将开始刷新一些 memstore,直到 memstore 使用的内存低于堆的至少 35%(lowerLimit 属性)。这是可调整的,但您需要进行完美的计算才能进行此更改。

是的,GC 确实会影响 memstore,您实际上可以通过使用 Memstore-local 分配缓冲区来修改此行为。我建议您阅读关于“使用 MemStore-Local 分配缓冲区避免 HBase 中的完整 GC”的 3 部分文章,如下所示: http ://www.cloudera.com/blog/2011/02/avoiding-full-gcs-in -hbase-with-memstore-local-allocation-buffers-part-1/

于 2012-05-16T05:35:24.010 回答
0

问题是java作为一种技术在处理创建和删除大量对象的服务器方面存在问题,同时应该及时响应所有请求。根本原因是垃圾收集器有时应该这样做,称为“停止世界”并清理内存。在大堆中,它可能会导致几秒钟的延迟。
现在让我们看看为什么它会发生在 HBase 上,以及为什么它必须及时响应。
Memstore 是区域数据的缓存。如果数据高度易变,则会创建/删除许多对象。结果有很多 GC(垃圾收集器)压力。
HBase,因为任何处理大数据集的实时系统都倾向于尽可能多地缓存,并且它的 MemStore 很大。
HBase 区域服务器必须及时与 ZooKeeper 进行通信,以告知它们还活着并避免迁移。Long GC pacuse 可以防止它。
cloudera 做了什么——实现了自己的内存管理机制,专门用于 MemStore 以避免 GC 暂停。Larse 在他的书中描述了如何调整 GC 以使其更好地与 Region Server 一起工作。
http://books.google.co.il/books?id=Ytbs4fLHDakC&pg=PA419&lpg=PA419&dq=MemStore+garbage+collector+HBASE&source=bl&ots=b-Sk-HV22E&sig=tFddqrJtlE_nIUI3VDMEyHdgx6o&hl=iw&sa=X&ei=79CyT82BIM_48QO_26ykCQ&ved=0CHUQ6AEwCQ#v= onepage&q=MemStore%20garbage%20collector%20HBASE&f=false

于 2012-05-16T05:35:46.660 回答