HBase写入性能改造(续)--MemStore、flush、compact参数调优及压缩卡的使用【转】

首先续上篇测试:

经过上一篇文章中对代码及参数的修改,Hbase的写入性能在不开Hlog的情况下从3~4万提高到了11万左右。

本篇主要介绍参数调整的方法,在HDFS上加上压缩卡,最后能达到的写入性能为17W行每秒(全部测试都不开Hlog)。


上篇测试内容:

详情 http://blog.csdn.net/kalaamong/article/details/7275242

测试数据 http://blog.csdn.net/kalaamong/article/details/7290192

同时上一篇中除压缩卡之外的代码改动被整理成patch放到了Git上。打上patch修改参数之后写入随便压到7至8万应当都是没问题的。感谢某试用过的童鞋。

https://github.com/ICT-Ope/HBase.0.90.4_Put_Throughput_Improvement

一个简单的Read Me:

[plain] view plain copy

  1. Changes:
  2. * Add multi-thread flush and compaction to HBase-0.90.4
  3. * One HBase client process could use more than one connection to contact with one RegionServer
  4. * Disable Auto Split. !!be careful!! The split version is available.
  5. New Configurations:
  6. * hbase.hstore.flush.thread 20
  7. the number of flush thread
  8. * hbase.hstore.compaction.thread 5
  9. the number of compaction thread
  10. * hbase.hregion.memstore.flush.block.size 120000000
  11. if region size reach this number, updates of this region will be blocked
  12. * client.connection.number 10
  13. connection number of one client process to one RegionServer
  14. Recommended Configuration (for load test or for mainly writing workload)
  15. * ipc.server.read.threadpool.size 40
  16. * hbase.server.thread.wakefrequency 500
  17. * hbase.hstore.blockingStoreFiles 20000000

1.遗留的问题--首先为什么最后的测试没出现瓶颈:

这是上篇文章中第五组测试时CPU和JVM GC的情况,当时的系统吞吐量稳定在11w/s。

CPU 徘徊在80%多一点,没有找到瓶颈的位置。

首先看一下我们集群的参数:


测试机性能


CPU


16* Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz


MEMORY


48GB


DISK


12*SATA 2TB


NET


4*1Gb Ethernet

下面简单分析一下:

CPU

最直白的是Region Server CPU只到80%左右。没有到瓶颈。

DISK

12*SATA *5 data node最差的情况下能提供 50MB*12*5=3000MB/s的吞吐量。

写入10亿行数据最后变成没有压缩的HFile大约450GB,同时三副本开销约1350GB。

上次测试最快完的一组耗时2小时24。

也就是说平均写入磁盘的通量是160MB/S。这远没达到磁盘通量。

并且非常重要的一点,最后的一组测试是使用压缩卡的,HDFS透明压缩后数据量下降到1/4左右。

也就是说实际的平均通量也就是30MB/S到50MB/S。如此看来磁盘很闲。

NET

所以最有嫌疑是就是网络,并且是hbase client到Region Server这一段,没有压缩的数据传输可能遇到了网络的瓶颈。

但仔细一算未压缩的数据写入磁盘通量是160MB/S,HBase client到Region Server这一段数据没有副本。

也就是说平均通量为50MB/S。对于单张网卡压力较大,但其实也没有到瓶颈。

写入稳定性

所以还有一个可能的问题,就是我们在监控网卡时发现HBase运行时,写入流量不稳定,网络流量时高时底。

2.解决问题:多网卡绑定

 

现象:

测试服务器网卡采用双网卡4千兆口bond 0链路聚合。交换机上四口绑定为trunk。

但实际测量的情况是双机互联数据传输时不论开多少端口用多少链路,传输极限还是只能到一张网卡的速度110MB左右。

且实际的现象是发送机的所有网卡都有数据output而接收机的网卡只有一个口有input数据包。

原因:H3C-S5120-SI  trunk负载均衡策略问题

问题渐渐浮出水面了,交换机即使trunk了也没有对四个端口作负载均衡。而操作系统在发送时是会做网卡的负载均衡的。

同时我们又测了一下多台机器向一台机器发送数据,及一台机器向多台机器发送数据的情况。

结果都是两个测试中的单点都流量都能超过单张网卡的流量。

如此我们有理由怀疑交换机trunk负载均衡是利用源和目的MAC地址来做的。

所以对于源和目的MAC都相同的双机对传数据的情况,不论开多少端口速度也超不过一张网卡。

交换机型号为H3C-S5120-SI。去年8月份购入,默认安装的固件不支持修改聚合均衡模式。

不过H3C官网提供升级,并添加了以下几条新命令可以修改模式。

display link-aggregationload-sharing mode

link-aggregation load-sharingmode

同时H3C官方说明如下:

缺省情况下,全局采用的聚合负载分担类型是:二层报文根据源/目的MAC地址进行聚合负载分担,三层报文根据源/目的MAC地址及源/目的IP地址进行聚合负载分担。

http://www.h3c.com.cn/Service/Document_Center/Switches/Catalog/S5120/S5120-SI/Command/Command_Manual/H3C_S5120-SI_CR-Release_1505-6W101/99/

我们改用了源port和目的port的负载均衡。这个问题被解决。

点对点传输多个端口的情况下,双网卡四千兆网口绑定流量实测为350MB/s左右。

3.解决问题:HBase写入通量波动问题

几个常见参数的之间的关系:


hbase.hregion.memstore.flush.size                                             默认 1024*1024*64L

hbase.hregion.memstore.block.multiplier                                   默认  2

hbase.regionserver.global.memstore.upperLimit                      默认  0.4

hbase.regionserver.global.memstore.lowerLimit                       默认  0.35

以及在patch中添加的一个参数:

hbase.hregion.memstore.flush.block.size

hbase.hregion.memstore.flush.size          

每次update之后会检查此region memstore是否达到这个大小,达到之后就会请求flush。默认值为64MB

hbase.hregion.memstore.block.multiplier

当单个region 的memstore size达到hbase.hregion.memstore.flush.size*hbase.hregion.memstore.block.multiplier时,本region的update会被block。

hbase.regionserver.global.memstore.upperLimit

当RS memstore超过这个比率,RS的所有update会被block。

具体见reclaimMemStoreMemory(),这几乎是个跟gc一样的stop word上限。

hbase.regionserver.global.memstore.lowerLimit

当用memstore高于这个值时,即使没有region要求flush,MemstoreFlusher也会挑一个region去flush然后sleep一会,这个参数影响不大。

调整原则:

1.让memstore占用尽量大,一方面可以缓冲定入流量,一方面可以增加StoreFile大小,减少flush次数,减少StoreFile数目减小Compact压力

2.控制memstore总大小,不大于memstore.upperLimit,不出现RegionServer block。

3.每个Region交错flush。

最初HBase RegionServer分到的内存是20GB。

由于是写入压测,所以把memstore大小调节到hbase.regionserver.global.memstore.upperLimit 0.55 即为11GB。

同时100个Region同时写入,到region达到block时,也就是最坏情况下memstore能达到的最大值为11.75GB。

这样则有可能达到upperLimit而阻碍整个RS的update。

这里我们把RS的内存调到了30GB。并增加了flush的线程数到30,优先级最大。

之后我们发现压测过程中memstore占用维持在4到5GB左右。

按道理一共能使用的16GB memstore都处于闲置状态。刷新次数频繁导致刷新产生的文件多,且文件大小都偏小。

加重了compact的负担,同时过小的memstore也是产生波动的主要原因。

所以将hbase.hregion.memstore.flush.size调整到100MB。

同时添加了一个参数控制代替系统中使用的hbase.hregion.memstore.block.multiplier参数。

名为hbase.hregion.memstore.flush.block.size来直接控制单个region blockupdate时的size大小,并设为120000000。

如此之后memstore 的size在压测过程中一直维持在8到10GB之间。写入通量也更为平稳了。

4.解决问题:其它改动

1 .打开了LAB。来减少full GC的次数。

2 .减少compact线程

之后压测时发现CPU大量消耗在compact线程上,所以我们把compact的线程数目重新降到1。

(由于现在flush时region更大,compact相对压力较小)。

compact优化的是读取,在写入密集的应用中作用不大。

同时把hbase.hstore.blockingStoreFiles设到一个非常大的值,使compact不会阻塞flush的进行。

3 .  加速反序列化

[plain] view plain copy

  1. org.apache.hadoop.io.WritableFactories
  2. private static final HashMap<Class, WritableFactory> CLASS_TO_FACTORY

改为ConcurrentHashMap并去掉了相关方法中synchronize关键字来加速反序列化过程。

5.效果:

经过这样的修改之后,压测时基本又回到最cpu 90%以上的情况。

经分析30%多的CPU消耗在Put插入Memstore时Bytes.compareTo()上,20%左右的CPU消耗在IPC Reader反序列化数据上。

6.附加内容:

我们尝试用JNI调用memcmp来替换compareTo()方法,

但发现效果非常差,不是memcmp慢,而是JNI调用非常慢。系统吞吐量下降到5w左右。

再说说压缩卡的作用,我们做的HDFS上的GZ压缩卡透明压缩,起初我们以为会有明显的off loading cpu的效果,但实际测试并不明显。

主要还是现在服务器cpu太强,再HBase写入时CPU的消耗大部分不在做压缩上。

其实压缩卡最大的作用还是大大提高了磁盘的通量,通过压缩在几乎没有时延的前提下让磁盘IO提高4到5倍。

 

最后下面是我们刚拿到的新硬:

Intel的新CPU,这只是半个节点的配置,简单用上面的数据测试了一下,吞吐量轻松过30W/S。

这也从侧面证明了HBase写入时瓶颈通常还是CPU。

PC Server快赶上小型机了。

7:本次测试的详细测试结果

测试分为三组,数据和集群情况与http://blog.csdn.net/kalaamong/article/details/7290192相同

 

三组分别为:不做数据压缩,使用软件GZ压缩,使用压缩卡HDFS层GZ透明压缩。

(Put.setWriteToWAL(false);不写log)

三组的写入流量都比上次测试的要稳定。

 

不压缩的情况:

软件GZ压缩的情况:

HDFS上GZ压缩卡透明压缩

这一组采用了我们新添加的功能,HDFS透明硬件压缩卡数据压缩。以下是测试结果。

时间: 2024-10-14 13:16:30

HBase写入性能改造(续)--MemStore、flush、compact参数调优及压缩卡的使用【转】的相关文章

柯南君:教你如何对待大型网站平台的性能优化? 之 二--- 应用程序调优 (长篇总结)

柯南君:教你如何对待大型网站平台的性能优化? 之 "二"--- 应用程序调优(长篇总结) 柯南君 上一章 <柯南君:教你如何对待大型电商平台的性能优化?之 一 (方法.指标.工具.定位)>讲到了一些测试方法.测试指标.以及测试工具.稍微讲了一些如何定位的方法?这一章主要讲一下"如何优化应用程序,将其性能提升". 一.基本知识  1.下面讲一些JAVA 程序性能方面的一些看法,首先给大家讲一下应用程序调优,需要调优哪些项? ① 运算的性能 : 看哪一个算法

Java 性能优化系列之3.1[JVM调优]

Java 虚拟机内存模型 JVM 虚拟机将其内存数据分为程序计数器.虚拟机栈.本地方法栈.Java 堆和方法区等部分. 程序计数器用于存放下一条运行的指令:虚拟机栈和本地方法栈用于存放函数调用栈信息: Java堆用于存放Java 程序运行时所需的对象等数据:方法区用于存放程序的类元数据信息. 1. 程序计数器- Program Counter Register 是一块很小内存空间. 由于Java  是支持线程的语言, 当线程数量超过CPU 数量时,线程之间根据时间片轮询抢夺CPU 资源.对于单核

SOLR管理配置和性能优化JVM参数调优

我个配置:JAVA_OPTIONS="-Xmx1024m -Xms1024m -Xmn512m -XX:MaxPermSize=128m -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0 -Xnoclassgc -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBefor

Ceph性能优化 之 配置参数调优

该文同时发表在盛大游戏G云微信公众号,粘贴于此,方便各位查阅 Ceph,相信很多IT朋友都听过.因为搭上了Openstack的顺风车,Ceph火了,而且越来越火.然而要用好Ceph却也不是件易事,在QQ群里就经常听到有初学者抱怨Ceph性能太烂,不好用.事实果真如此吗!如果你采用Ceph的默认配置来运行你的Ceph集群,性能自然不能如人意.俗话说,玉不琢,不成器:Ceph也有它的脾性,经过良好配置优化的Ceph性能还是不错的.下文简单分享下,盛大游戏G云在Ceph优化上的一些实际经验,如有错误之

JVM性能优化--JVM参数配置,使用JMeter简单测试配合说明参数调优

一.JVM参数配置 1.常见参数配置 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails 更详细的GC日志 -Xms 堆初始值 -Xmx 堆最大可用值 -Xmn 新生代堆最大可用值 -XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例. -XX:NewRatio 配置新生代与老年代占比 1:2 含以-XX:SurvivorRatio=eden/from=den/to 总

HBase最佳实践-CMS GC调优(从gc本身参数调优)

同志们,此部分,重要的不能再重要了1.HBase发展到当下,对其进行的各种优化从未停止,而GC优化更是其中的重中之重.hbase gc调优方向从0.94版本提出MemStoreLAB策略.Memstore Chuck Pool策略对写缓存Memstore进行优化开始,到0.96版本提出BucketCache以及堆外内存方案对读缓存BlockCache进行优化,再到后续2.0版本宣称会引入更多堆外内存,可见HBase会将堆外内存的使用作为优化GC的一个战略方向. 然而无论引入多少堆外内存,都无法避

机器学习:模型性能评估与参数调优

模型性能评估的常用指标 真阳性(True Positive,TP):指被分类器正确分类的正例数据 真阴性(True Negative,TN):指被分类器正确分类的负例数据 假阳性(False Positive,FP):被错误地标记为正例数据的负例数据 假阴性(False Negative,FN):被错误地标记为负例数据的正例数据 精确率=TP/(TP+FP),TP+FP是模型预测的正样本总数,精确率衡量的是准确性: 召回率=TP/(TP+FN),TP+FN是真实的正样本总数,召回率衡量的是覆盖率

转 hbase参数的意义和调优

测试时发现理解这些参数都代表什么意义非常的重要,而且通过参数调优可以提高性能,希望仔细阅读一下每个属性代表的意义! 感谢原作者的整理,转来仅做学习笔记使用 <span style="font-family:Microsoft YaHei;"><?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"

Hadoop之MapReduce性能调优

基于对这些组件的深入理解,用户可以很容易通过调整一些关键参数使作业运行效率达到最优,本文将分别从Hadoop管理员和用户角度介绍如何对Hadoop进行性能调优以满足各自的需求. 1 概述 Hadoop性能调优是一项工程浩大的工作,它不仅涉及Hadoop本身的性能调优,还涉及更加底层的硬件.操作系统和Java虚拟机等系统的调优.对这几个系统适当地进行调优均有可能给Hadoop带来性能提升. Hadoop(JobTracker.TaskTracker) JVM OS Hardware(CPU Mem