hbase优化小结
目录:
1,背景
2,GC
3,hbase cache
4,compaction
5,其他
1,背景
项目组中,hbase主要用来备份mysql数据库中的表。主要通过接入mysql binlog,经storm存储到hbase。由于是实时接入binlog写入,写的压力不是很大,主要是晚上离线计算的时候,需要将hbase中的表同步到HDFS中,这个时候对hbase的读性能以及全表扫描性能要求有些高,以尽量较少数据导入时间。由于之前时间仓促,以及对hbase了解有限等原因,hbase这块问题多多。当前阶段比较突出的问题主要有两个方面:第一,full GC频繁。 第二,尽量提升hbase的读性能,尤其是scan的性能。
2,GC
问题:通过jstat命令发现regionserver进程full GC非常的频繁,甚至发现full GC的次数比young gc的次数还要多。full gc严重导致region server不稳定,经常运行几天后regionserver会死掉。
原因:通过分析gc log以及实时观察,发现主要是读频发的时候,young区的S1,S2会很快到达100%,导致新的对象快速进入old区,此外,old区full gc不能有效快速回收内存,导致old去的内存一直维持在高位(总是高于设定的CMSInitiatingOccupancyFraction),所以导致old gc比young gc还多。
尝试办法:由于young区在hbase读频繁的时候很快被填满,所以很自然的尝试便是增大young区的大小。但是大了以后产生了两个负面效果,一是young gc时间变长了,二是还是不能解决read的时候young区被快速填满的问题。这时意识到,单纯通过GC调参来解决full gc频繁问题的思路行不通了。
mark一下优化后的GC配置:
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Xmx2000m -Xms2000m -Xmn750m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:-CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=70"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -Xmx16000m -Xms16000m -Xmn7000m -XX:MaxDirectMemorySize=5g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:-CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=75 -Xloggc:${HOME}/hdp_data/hbase/rs.log-`date +'%Y%m%d%H%M'` -verbose:gc -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:SurvivorRatio=2 -XX:+PrintTenuringDistribution"
3,hbase cache
hbase中与内存相关的主要是memstore和block cache,memstore主要服务于写,而block cache主要服务与读。有关block cache的详细介绍,可以参看block cache。hbase默认的block cache策略是LRU block cache,这时所有的cache都放在java进程的heap中,所以导致对hbase读的时候heap中的内存快速增长。bucket cache通过将date block缓存到direct buffer管理的堆外内存中,有效解决了这个问题。通常采用一种混合的策略即combined block cache(LRU block cache + bucket cache). LRU block cache主要用来缓存bloom过滤器,索引等。配置如下:
GC参数设置:-XX:MaxDirectMemorySize=5g,设置java进程使用direct memory的最大值。
hbase-site.xml中配置如下:
<!--LRU Cache-->
<property>
<name>hfile.block.cache.size</name>
<value>0.4</value>
</property>
<!--Bucket cache-->
<property>
<name>hbase.bucketcache.ioengine</name>
<value>offheap</value>
</property>
<property>
<name>hbase.bucketcache.size</name>
<value>4196</value>
</property>
设置以后,hbase regionsever进程full gc问题圆满解决。
4,hbase compaction
hbase compaction主要是合并memstore flush到磁盘上的HFile文件。主要分minor compaction和major compaction。minor compaction只会合并很少的hfile,这个花费的时间也不是很长。而major compaction会合并指定table的所有的HFile,所以花费的时间也比较长,但是能够显著提高hbase的读性能。考虑到白天hbase集群的负载并不是很高,所以很自然想到就是做手工major compaction。写一个简单的脚本就好了。其实就一行语句:echo "major_compact 'tablename'" | hbase shell,然后通过crontab定时启动就好了。做了major compaction以后region server的block locality明显好转,hbase读的性能提升提升了50%以上,晚上导表时间几乎缩短了一半。
5,其他
其他的方法也尝试了一些,比方说设置hbase.client.scanner.caching参数,以及在每台datenode的机器上都部署region sever以增强data locality,还有增大hbase导表的并发数等,这些有一些效果,但是不是太明显。
总的来说,这次主要是熟悉hbase相关的原理和配置,然后通过设置一些策略和参数来提升hbase的性能,虽然比较简单粗暴,但是以上方法已基本满足当前需求,所以对hbase读性能的优化暂时告一段落。接下来会对hbase的稳定性以及可运维性做一些测试。
hbase优化小结的更多相关文章
- 大数据技术之_11_HBase学习_02_HBase API 操作 + HBase 与 Hive 集成 + HBase 优化
第6章 HBase API 操作6.1 环境准备6.2 HBase API6.2.1 判断表是否存在6.2.2 抽取获取 Configuration.Connection.Admin 对象的方法以及关 ...
- Spark读Hbase优化 --手动划分region提高并行数
一. Hbase的region 我们先简单介绍下Hbase的架构和Hbase的region: 从物理集群的角度看,Hbase集群中,由一个Hmaster管理多个HRegionServer,其中每个HR ...
- HBASE 优化之REGIONSERVER
HBASE 优化之REGIONSERVER 一,概述 本人在使用优化regionserver的过程有些心得,借此随笔的机会,向大家介绍我的心得,有些是网上拿来的有些是自己在使用过程自己的经验,希望对大 ...
- Hbase优化方案
1.预分区设计 真正存储数据的是region要维护一个区间段的rowkey startRow~endRowkey ->手动设置预分区 create 'user_p','info','partit ...
- Oracle性能优化小结
Oracle性能优化小结 原则一.注意where子句中的连接顺序 Oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须卸载其他where条件之前,哪些可以滤掉最大数量记录的 ...
- 移动 web 开发问题和优化小结
1.前言 到目前为止,互联网行业里,手机越来越智能化,移动端占有的比例越来越高,尤其实在电商,新闻,广告,游戏领域.用户要求越来越高,网站功能越来越好,效果越来越炫酷,这就要求我们产品质量越来越高,w ...
- css写作建议和性能优化小结
1.前言 还有几天就到国庆中秋了,快要放假了,先祝大家节日快乐!之前写过js的写作建议和技巧,那么今天就来聊聊css吧!说到css,每一个网页都离不开css,但是对于css,很多开发者的想法就是,cs ...
- lucene索引文件大小优化小结
http://www.cnblogs.com/LBSer/p/4068864.html 随着业务快速发展,基于lucene的索引文件zip压缩后也接近了GB量级,而保持索引文件大小为一个可以接受的范围 ...
- SQL Server 2016 查询存储性能优化小结
SQL Server 2016已经发布了有半年多,相信还有很多小伙伴还没有开始使用,今天我们来谈谈SQL Server 2016 查询存储性能优化,希望大家能够喜欢 作为一个DBA,排除SQL Ser ...
随机推荐
- iOS点击cell时,控件背景色消失的解决方法
同时调用一下两个方法: - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected ...
- codevs——1039 数的划分
1039 数的划分 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 将整数 ...
- linux 用 rsync 快速删除大量小文件
假设我们在目录 /tmp/to_delete 下有很多小文件 a1 a2 a3 f1 f2 f3 现在我们想快速的删除f 开头的文件. 如果文件量大,用rm 可能会失败,而且会很慢, 所以用rsync ...
- 网络学习之OSI七层协议和TCP协议
OSI七层简单介绍 应用层:提供操作系统和应用程序的接口 表示层:表示数据如何加密.如何压缩的 会话层:将不同应用程序数据分离 传输层:提供可靠和不可靠的数据传输和重传.纠错的功能 网络层:提供IP地 ...
- [Spring] Properties for project configuration
We might have some project specific configuration need to setup. The good approach to do this in Spr ...
- [VueJS + Typescript] Decouple Dependencies Using IoC Containers in Vue with TypeScript and InversifyJS
Using Object Oriented Programming, OOP, style allows us to apply Inversion of Control, IoC, and more ...
- Maven+Mybatis+Spring+SpringMVC实现分页查询(附源代码)
以下小宝鸽将分享一篇Mybatis分页功能的博文,以下将给出具体的步骤.跟着博主的节奏肯定能实现.另外最后还会附上整个project的源代码.假设是没有使用过maven的猿友可自行下载相关的jar包就 ...
- LeetCode_Mysql_Second Highest Salary
176. Second Highest Salary 1. 问题描写叙述: 写一个sql语句从 Employee 表里获取第二高位的工资. 2. 解决思路: 这道题非常easy,就当热身了.首先用ma ...
- MySQL通过函数获取字符串汉字拼音首字母大写字符串
DELIMITER $$ DROP FUNCTION IF EXISTS `Fun_GetPY`$$ CREATE FUNCTION `HIS`.`Fun_GetPY` (in_string VARC ...
- javascript下的json 序列化及反序列化
1.序列化 将json对象转为字符串: JSON.stringify(jsonObj) 2.反序列化 var jsonObj = eval("(" + jsonstring + & ...