2012-05-15 99 views
4

我是HBase的新手,但是我已经设置了一些关于HBase和Hadoop的知识。HBase MemStore和垃圾回收

当我正在研究HBase MemStore时,我所了解的MemStore是“MemStore是HBase放置必须写入或读取的数据的内存中的位置”。 所以,这就是为什么当我们想要阅读关于memstore的时间和地点时,我们也看到关于垃圾收集的讨论。

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

回答

5

你是对的Hbase Memstore。一般情况下,当HBase写入内容时,首先将它写入内存存储(memstore),一旦这个memstore达到一定的大小*,它就会被刷新到磁盘中,存储到一个存储文件中(所有内容也会立即写入日志文件的耐用性)。

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

是GC确实会影响到memstore,并且实际上可以通过使用Memstore本地分配缓冲区来修改此行为。我建议你阅读“避免完全的GC在HBase的用那种MEMSTORE本地的分配缓冲区” 3个部分的文章如下: http://www.cloudera.com/blog/2011/02/avoiding-full-gcs-in-hbase-with-memstore-local-allocation-buffers-part-1/

0

的问题是,Java作为一种技术必须处理它创建服务器问题,删除大量对象,同时应及时响应所有请求。根本原因是垃圾收集器,它有时候应该叫做“停止世界”并清理内存。在大堆中可能导致延迟几秒钟。
现在让我们来看看为什么它发生在HBase以及为什么它必须及时做出回应。
Memstore是区域数据的缓存。如果数据非常敏感,则会创建/删除大量对象。因此有很多GC(垃圾收集器)压力机。 HBase,因为任何使用大数据集的实时系统都倾向于尽可能缓存,而且它的MemStore很大。
HBase Region Servers必须及时与ZooKeeper进行通信,让他们知道他们还活着并避免迁移。长期的GC会阻止它。
cloudera做了什么 - 为MemStore实施专门的内存管理机制以避免GC暂停。 他书中的粗略描述了如何调整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