`
shenchunhui
  • 浏览: 147181 次
  • 来自: 杭州
社区版块
存档分类
最新评论

GC trouble on HBase

阅读更多
最近几天一直纠结在HBase的GC问题上,虽然没有质的收获,但也有一些新的心得,对HBase上GC产生的过程有了更深的认识。

由于基本采用的都是CMS回收,所以讨论也针对的是CMS回收。

GC问题可以简单地归结为YGC停顿过长和FullGC触发。

1.FullGC触发
CMS下触发FullGC的原因:
a.Concurrent mode failure,old区要分配内存了,但是old区空间不够,而此时CMS正在进行中。
解决方法:降低YGC频率,降低CMS gc触发时机(降低CMSInitiatingOccupancyFraction的值)

b.Promotion Failed,old区要分配内存了,但是找不到空间分配,却还没达到CMS的触发值,这个问题主要是由heap碎片+YGC晋升对象过大导致,HBase中YGC期间晋升的大对象为:LRUBlockCache中的Block(64KB)和开启MSLab后的Chunk(2MB,Chunk介绍http://www.taobaotest.com/blogs/2310),这两个问题可以通过BucketCache(HBASE-7404)和ChunkPool(HBASE-8163)解决之


2.YGC停顿过长
YGC时间构成=扫描stack+扫描card table+扫描root+对象拷贝,
扫描stack是扫描线程栈找出活跃对象的时间,一般比较快;

Hotspot将old区按512字节的page进行划分,存放到内部的card表中,所以扫描card table的时间,取决于old区的大小;

当修改old区的对象的某一个引用后,那么就会标记这个对象所在的page为脏页,并且将这个page中的所有对象作为root,进行扫描,所以如果频繁地更改old区对象中的引用,那么就会有很多root需要扫描,这部分时间基本决定了YGC的时间;

举个HBase中的例子,Memstore中有个排序Set用来存储刚刚写进来的keyvalue,当flush后,这个Set对象及其中的KeyValue对象就会死亡,由于flush周期较长,所以很多对象会在old区存活一定的时间。每当向Memstore写入一条数据就会向Set中插入一条KeyValue,这就意味着我们会修改这个新插入的Keyvalue对应的Node Entry的前继对象的next指针的引用


YGC过程中,所有活着的对象会拷贝到to space或者old区,这些活着对象的大小决定了拷贝过程的时间


按照对象的存活时间我们可以将HBase中的对象分为三类:1.函数内的临时对象;2.存活一定周期的对象(Memstore中的KeyValue,LRUBlockCache中的Block,开启WAL压缩后的row/table/region/cf对象);3.永久存活的对象(开启BucketCache后的Block,开启ChunkPool后的Chunk);

在开启BucketCache和ChunkPool,YGC后晋升的数据会十分的少,拷贝对象的时间可以忽略不计

于是,在一个YGC周期中,新产生的类型2对象的数目会直接决定了YGC的时间,相比而言,KeyValue比Block的数目多很多,这就是说一个YGC周期写入的KeyValue数目决定着YGC的时间

关于YGC的RT:
1.HBase的写是造成YGC RT过长的主因
2.在BucketCache后,HBase的读对YGC RT的影响较小


关于YGC的频率,有这么2个发现:
1.compaction期间,YGC频率大大加快
2.单条put比批量put,YGC频率要快很多,通过观察,单条put的方式,1G young区,4000TPS,大概2秒一次的YGC,而批量方式,则YGC周期要长很多,单次YGC的时间也会长很多


关于UseAdaptiveSizePolicy的配置
配了后直接abort!!
为了控制YGC的时间,我们可以降低young区的大小,但是compaction期间,YGC频率会大大加快,所以想到启用UseAdaptiveSizePolicy,但是实践后发现会直接导致Server Abort,原因是由于在调整young区的eden s0 s1的比例后HeapMax会不一致,导致内部报错


关于SurvivorRatio的配置
通过gcutil观察每次ygc后to space的所占比例,如果很低,那么可以加大这个配置值,在开启bucketcache和chunkpool后,这个配置值可以配的比较大。如果发现YGC后to space的比例一直是100%,那说明to space太小了,直接导致很多对象进入了old区

关于young区的大小
目前我们配置的young大小由4G,2G,1G,属于比较大的;在开启了BucketCache和ChunkPool后,晋升数据很少;对于RT敏感的应用,可以根据YGC的频率, 减少young区到512M甚至256M,来减少RT


YGC优化:
1.减小-XX:MaxTenuringThreshold,默认值为15,通常意味着一个对象经过15次YGC后还活着则会晋升到old区(当然还会有一些额外的因素,来影响晋升的速度),对于HBase中的对象,1.函数中的临时对象会很快淘汰;2.永久对象会一直在old区;3.周期存活的对象一般会晋升到old区后再死亡,所以我们可以减小这个值,一来可以减少对象拷贝,二来可以减少young区的对象数据,减少ygc期间的扫描

效果:1G young,50/100 KeyValue, MaxTenuringThreshold=15 -> MaxTenuringThreshold=3, YGC时间 0.034ms->0.014ms, 频率不变

2.终极改进:基于字节流的排序Set,向set中插入数据的时候,不再需要改变引用关系,而只需要改变byte值,这样可以完美的解决YGC问题,TODO。。。
分享到:
评论
1 楼 blackproof 2015-03-17  
chunkpool怎么用的,要是设置了0.1会跟 memstore和blockcache抢rs内存吗

相关推荐

    MapReduce on Hbase

    HBase是建立在Hadoop文件系统之上的一个开源、分布式的非关系型数据库(NoSQL),它以列族的形式存储数据。由于HBase是建立在Hadoop生态系统之上,因此它可以和Hadoop的其他组件,如MapReduce,很好地协同工作。 ...

    SparkOnHBase:SparkOnHBase

    :warning: Cloudera Labs中的Spark On HBase项目在2015年被合并到上游HBase项目中,并且自CDH 5.7起CDH附带了Backport SparkOnHBase 概述 这是一个用于Spark的HBase的简单可重用库 功能性 当前功能支持以下功能 批量...

    HbaseTemplate 操作hbase

    在IT行业中,尤其是在大数据处理领域,HBase是一个广泛使用的分布式、高性能、列式存储的NoSQL数据库。HBase是建立在Hadoop文件系统(HDFS)之上,为处理大规模数据提供了一个高效的数据存储解决方案。而Spring Data...

    Interactive SQL query on HBase (孙元浩)

    《交互式SQL查询在HBase上》这篇文章由孙元浩撰写,主要探讨了为什么需要在HBase上实现交互式查询,以及如何通过架构和HBase SQL操作符来实现这一需求。文章详细介绍了HBase SQL的功能特点和性能。 在介绍为什么...

    Phoenix_on_HBase性能测试报告.pdf

    Phoenix on HBase 性能测试报告 Phoenix on HBase 是一个基于 HBase 的高性能数据处理引擎,它可以提供快速的数据查询和写入性能。在本报告中,我们对 Phoenix on HBase 的性能进行了测试,以探索其在数据查询和...

    藏经阁-HBase在小米的实践.pdf

    今天,我们将探讨小米公司在生产环境中使用 HBase 的实践经验,包括异步 HBase 客户端的实现、G1GC 调优、HBase 和 G1GC 的整合等。 一、异步 HBase 客户端 异步 HBase 客户端是为了解决阻塞式客户端带来的性能...

    HBase官方文档中文版-HBase手册中文版

    2. Spark集成:通过Spark on HBase进行实时分析。 3. Hive集成:通过Hive的HBase存储过程进行数据查询。 4. Flume、Kafka集成:用于日志收集和实时流处理。 这份“HBase官方文档中文版”详细阐述了HBase的核心概念...

    Hbase运维碎碎念.pptx

    Hbase 运维碎碎念是 Hbase 运维实践经验的总结,涵盖了 Hbase 的基本概念、JAVA 基础知识、HDFS 和 HBase 的关系、JVM Heap 的管理、GC 机制等多方面的知识。 在 Hbase 运维碎碎念中,我们可以看到作者对 Hbase ...

    藏经阁-云HBaseSQL及分析.pdf

    本资源摘要信息主要介绍了云HBaseSQL及分析相关知识点,包括Phoenix和Spark on HBase的应用。 HBase Native API是HBase提供的一种原生API,用于完成小数量简单分析和大数据量复杂分析。通过使用CP完成小数量简单...

    pinpoint的hbase初始化脚本hbase-create.hbase

    搭建pinpoint需要的hbase初始化脚本hbase-create.hbase

    mapreduce方式入库hbase hive hdfs

    mapreduce方式入库hbase hive hdfs,速度很快,里面详细讲述了代码的编写过程,值得下载

    HBase3.0参考指南

    Herein you will find either the definitive documentation on an HBase topic as of its standing when the referenced HBase version shipped, or it will point to the location in Javadoc or JIRA where the ...

    hbase安装包

    HBase,全称为Hadoop Distributed File System上的基础结构(HBase on Hadoop Distributed File System),是一种分布式的、面向列的开源数据库,它构建在Apache Hadoop文件系统(HDFS)之上,提供高可靠性、高性能...

    HBase配置文件与HBase doc文档

    2. **hbase-env.sh**:这个脚本用于配置HBase的环境变量,如JVM参数(堆大小、GC设置等)和HBase进程的启动选项。 3. **regionservers**:列出集群中提供服务的RegionServer节点。 4. **masters**:如果配置了主备...

    Hbase权威指南(HBase: The Definitive Guide)

    ### HBase权威指南知识点概述 #### 一、引言与背景 - **大数据时代的来临**:随着互联网技术的发展,人类社会产生了前所未为的数据量。这些数据不仅数量巨大,而且种类繁多,传统的数据库系统难以应对这样的挑战。 ...

    hbase配置内置的zookeeper

    ### HBase 配置内置 ZooKeeper 的详细步骤与解析 #### 一、配置背景与目的 在 HBase 的部署环境中,ZooKeeper 起着非常重要的作用,它主要用于协调集群中的各个节点,并且管理 HBase 的元数据。通常情况下,HBase ...

    hbase用于查询客户端工具

    HBase是一种分布式、基于列族的NoSQL数据库,它在大数据领域中扮演着重要的角色,尤其是在需要实时查询大规模数据集时。HBase以其高吞吐量、低延迟和水平扩展能力而闻名,常用于存储非结构化和半结构化数据。在HBase...

    HBase开启审计日志

    ### HBase开启审计日志详解 #### 一、概述 HBase是一款分布式列式存储系统,基于Google的Bigtable论文实现。它具有高可靠性、高性能、面向列、可伸缩的特点,非常适合处理海量数据。在大数据领域,HBase被广泛用于...

    HBase(hbase-2.4.9-bin.tar.gz)

    HBase(hbase-2.4.9-bin.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System...

Global site tag (gtag.js) - Google Analytics