【问题标题】:HBase MemStore and Garbage CollectionHBase MemStore 和垃圾回收
【发布时间】:2012-05-15 08:17:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: memory-management hadoop hbase


    【解决方案1】:

    您对 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/

    【讨论】:

      【解决方案2】:

      问题是java作为一种技术在处理创建和删除大量对象的服务器方面存在问题,同时应该及时响应所有请求。根本原因是垃圾收集器有时应该这样做,称为“停止世界”并清理内存。在大堆中,它可能会导致几秒钟的延迟。
      现在让我们看看为什么它会发生在 HBase 上,以及为什么它必须及时响应。
      Memstore 是区域数据的缓存。如果数据高度易变,则会创建/删除许多对象。结果有很多 GC(垃圾收集器)压力。
      HBase,因为任何处理大数据集的实时系统都倾向于尽可能多地缓存,并且它的 MemStore 很大。
      HBase 区域服务器必须及时与 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

      【讨论】:

        猜你喜欢
        • 2015-11-13
        • 1970-01-01
        • 2011-08-01
        • 2012-02-19
        • 2015-12-27
        • 1970-01-01
        • 2011-12-21
        • 2012-01-28
        • 2013-06-27
        相关资源
        最近更新 更多