HBase MemStore和垃圾收集

时间:2012-05-15 08:17:41

标签: memory-management hadoop hbase

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

问题是java作为一种技术在处理服务器方面存在问题,该服务器创建和删除大量对象,同时应及时响应所有请求。根本原因是垃圾收集器,有时应该这样做,称为“停止世界”并清理内存。在大堆中,它可能导致几秒钟的延迟。
现在让我们来看看为什么它会发生在HBase以及为什么它必须及时响应。
Memstore是区域数据的缓存。如果数据非常高,则会创建/删除许多对象。结果,有很多GC(垃圾收集器)压力 HBase,因为任何使用大数据集的实时系统都会尽可能地缓存,并且其MemStores很大。
HBase Region Servers必须及时与ZooKeeper通信才能让他们知道他们还活着并避免迁移。长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