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 ...
随机推荐
- maven bug之Maven:Non-resolvable parent POM: Failure to find错误
使用Maven编译淘宝的TimeTunnel项目时遇到如下错误: [INFO] Scanning for projects...[ERROR] The build could not read 1 p ...
- 『NSOperation、NSOperationQueue』详解
1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...
- ajax请求同步与异步的区别
//同步请求 $.ajax({ type:'post', url:"<c:url value='/device/org/' />"+val, data:{'org ...
- PHP中的extract函数的用途 extract($_GET);extract($_POST)
把客户端表单中的变量名取出来 addslashes -- 使用反斜线引用字符串 extract(addslashes($_POST)); --处理POST表单 把客户端<FORM METHOD= ...
- C# PDF Page操作——设置页面切换按钮 C# 添加、读取Word脚注尾注 C#为什么不能像C/C++一样的支持函数只读传参 web 给大家分享一个好玩的东西,也许你那块就用的到
C# PDF Page操作——设置页面切换按钮 概述 在以下示例中,将介绍在PDF文档页面设置页面切换按钮的方法.示例中将页面切换按钮的添加分为了两种情况,一种是设置按钮跳转到首页.下页.上页或者 ...
- web 开发之js---巧用iframe实现jsp无刷新上传文件
首先要说的就是 ajax 是无法实现上传文件的,可以想一下ajax与后台通信都是通过传递字符串,怎么能传递文件呢?其实出于安全考虑js是不能操作文件的,所以就不要再说用ajax来实现文件的上传了,这是 ...
- 【bzoj2464】中山市选[2009]小明的游戏
直接转换成最短路 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstr ...
- linux select poll and epoll
这里以socket文件来阐述它们之间的区别,假设现在服务器端有100 000个连接,即已经创建了100 000个socket. 1 select和poll 在我们的线程中,我们会弄一个死循环,在循环里 ...
- PHP博客项目-gai
XX科技还是米有电话过来,看样子真的是黄了.这段时间都没有好好学习,经历了两次稀里糊涂的面试,特别是第二次,让我感觉自己之前学的东西都已经忘了,本来就学的不多,也不扎实,还一忘...看了是真的要开始着 ...
- go8---函数function
package main /* 函数function Go 函数 不支持 嵌套.重载和默认参数. 但支持以下特性: 无需声明原型(C语言在使用函数之前需要声明函数的原型).不定长度变参.多返回值.命名 ...