Hbase读写性能测试调优
日期 |
版本 |
修订 |
审批 |
修订说明 |
2016.9.23 |
1.0 |
章鑫 |
|
初始版本 |
|
|
|
|
|
1 前言
本篇文章主要讲的是hbase读写性能调优过程中遇到的一些技巧和配置项的修改,对于hbase本身的原理和框架不会做太多的介绍。该文档中涉及到ycsb配置和使用方面的内容需要结合ycsb工具使用文档阅读理解。
2 配置
2.1 集群配置
[root@node1 ~]#uname -a
Linux node1.dcom 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
|
[root@node1 ~]# top
top - 10:02:40 up 51 days, 12:39, 11 users, load average: 1.42, 1.23, 1.04 Tasks: 414 total, 1 running, 413 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.6 us, 0.4 sy, 0.0 ni, 97.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 65772144 total, 23124796 free, 8079632 used, 34567716 buff/cache KiB Swap: 0 total, 0 free, 0 used. 56828368 avail Mem
|
[root@node1 ~]# free -m #64G内存
total used free shared buff/cache available Mem: 64230 7899 23391 475 32939 55486 Swap: 0 0 0 |
[root@node1 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/centos-root xfs 231G 11G 221G 5% / devtmpfs devtmpfs 32G 0 32G 0% /dev tmpfs tmpfs 32G 24K 32G 1% /dev/shm tmpfs tmpfs 32G 588M 31G 2% /run tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup /dev/sda1 xfs 494M 130M 364M 27% /boot /dev/mapper/centos-var xfs 100G 6.7G 94G 7% /var /dev/mapper/centos-opt xfs 600G 733M 599G 1% /opt tmpfs tmpfs 6.3G 0 6.3G 0% /run/user/0 /dev/sdc xfs 932G 66G 866G 8% /opt/hdata /dev/sdb1 xfs 932G 63G 869G 7% /opt/hdata2 /dev/sdd1 xfs 932G 65G 867G 7% /opt/hdata3 /dev/sde1 xfs 932G 67G 866G 8% /opt/hdata4
#Hdfs的datanode目录磁盘是sdb、sdc、sdd和sde,也就是说hbase存储在这四块磁盘上。总的大小大概是4T不到一点,4台设备的集群总大小大约在14.5T左右。 |
[root@node1~]# cat /proc/cpuinfo #24核
…………………… processor : 23 vendor_id : GenuineIntel cpu family : 6 model : 62 model name : Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz stepping : 4 microcode : 0x428 cpu MHz : 1211.109 cache size : 15360 KB physical id : 1 siblings : 12 core id : 5 cpu cores : 6 apicid : 43 initial apicid : 43 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms xsaveopt bogomips : 4204.89 clflush size : 64 cache_alignment : 64 address sizes : 46 bits physical, 48 bits virtual power management:
|
[root@node1 ~]# ethtool bond0 #网卡信息
Settings for bond0: Supported ports: [ ] Supported link modes: Not reported Supported pause frame use: No Supports auto-negotiation: No Advertised link modes: Not reported Advertised pause frame use: No Advertised auto-negotiation: No Speed: 2000Mb/s Duplex: Full Port: Other PHYAD: 0 Transceiver: internal Auto-negotiation: off Link detected: yes |
[root@node1 ~]# hadoop version #hadoop版本
Hadoop 2.7.1.2.4.2.0-258 Subversion git@github.com:hortonworks/hadoop.git -r 13debf893a605e8a88df18a7d8d214f571e05289 Compiled by jenkins on 2016-04-25T05:46Z Compiled with protoc 2.5.0 From source with checksum 2a2d95f05ec6c3ac547ed58cab713ac This command was run using /usr/hdp/2.4.2.0-258/hadoop/hadoop-common-2.7.1.2.4.2.0-258.jar |
[root@node1 ~]# hbase version #hbase版本
2016-09-06 14:52:19,070 INFO [main] util.VersionInfo: HBase 1.1.2.2.4.2.0-258 2016-09-06 14:52:19,071 INFO [main] util.VersionInfo: Source code repository file:///grid/0/jenkins/workspace/HDP-build-centos6/bigtop/build/hbase/rpm/BUILD/hbase-1.1.2.2.4.2.0 revision=Unknown 2016-09-06 14:52:19,071 INFO [main] util.VersionInfo: Compiled by jenkins on Mon Apr 25 06:36:21 UTC 2016 2016-09-06 14:52:19,071 INFO [main] util.VersionInfo: From source with checksum 4f661ee4f9f148ce7bfcad5b0d667c27 |
[root@node1 ~]# hdfs version #hdfs版本
Hadoop 2.7.1.2.4.2.0-258 Subversion git@github.com:hortonworks/hadoop.git -r 13debf893a605e8a88df18a7d8d214f571e05289 Compiled by jenkins on 2016-04-25T05:46Z Compiled with protoc 2.5.0 From source with checksum 2a2d95f05ec6c3ac547ed58cab713ac This command was run using /usr/hdp/2.4.2.0-258/hadoop/hadoop-common-2.7.1.2.4.2.0-258.jar |
Hadoop集群共有相同配置的4个node节点,在其他相同配置的集群以外的node节点上运行ycsb测试进程,hadoop集群是通过ambari软件运行维护的,对应的很多配置都是在ambari的web界面上去完成的。
2.2 hadoop配置
这里的hadoop配置主要包括了hbase和hdfs两类配置,读写在具体配置时会有稍许不同,这个在具体的地方会具体指明。
在后面第4、5章中介绍读写配置时没有单独指出介绍的配置项一般在两种情况下都较为适用,而且几乎都已经调到了最大值,在这里会统一介绍。
2.2.1 hbase配置
[root@node1 test]# cat /usr/hdp/current/hbase-client/conf/hbase-site.xml
<configuration>
#Todo <property> <name>dfs.domain.socket.path</name> <value>/var/lib/hadoop-hdfs/dn_socket</value> </property>
#Todo <property> <name>hbase.bulkload.staging.dir</name> <value>/apps/hbase/staging</value> </property>
#每条记录的最大大小为1MB <property> <name>hbase.client.keyvalue.maxsize</name> <value>1048576</value> </property>
#hbase client操作失败重新请求数为35 <property> <name>hbase.client.retries.number</name> <value>35</value> </property>
#当一次scan操作不在本地内存时,需要从disk中获取时,缓存的条数,这里设置为100000条,该值不能大于下文中hbase.client.scanner.timeout.period配置项的值 <property> <name>hbase.client.scanner.caching</name> <value>100000</value> </property>
下图中的第一个配置项hbase.client.scanner.timeout.period对应的是上文中的Number of Fetched Rows when Scanning from Disk,它的值必须小于下图中的第一个配置项才行。 第二个配置项的话默认是true的,无需额外配置,之前在解决一个相关问题时,将它置为了false。 <property> <name>hbase.client.scanner.timeout.period</name> <value>120000</value> </property>
#hbase是否配置为分布式 <property> <name>hbase.cluster.distributed</name> <value>true</value> </property>
#Todo <property> <name>hbase.coprocessor.master.classes</name> <value></value> </property>
#Todo <property> <name>hbase.coprocessor.region.classes</name> <value>org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint</value> </property>
#设置为ture,忽略对默认hbase版本的检查(设置为false的话在maven工程的编译过程中可能会遇到版本相关的问题) <property> <name>hbase.defaults.for.version.skip</name> <value>true</value> </property>
#设置系统进行1次majorcompaction的启动周期,如果设置为0,则系统不会主动出发MC过程,默认为7天 <property> <name>hbase.hregion.majorcompaction</name> <value>604800000</value> </property>
#用来作为计算MC时间周期,与hbase.hregion.majorcompaction相结合,计算出一个浮动的MC时间。默认是0.50,简单来说如果当前store中hfile的最早更新时间早于某个MCTime,就会触发major compaction,hbase通过这种机制定期删除过期数据。MCTime是一个浮动值,浮动区间为[ hbase.hregion.majorcompaction - hbase.hregion.majorcompaction * hbase.hregion.majorcompaction.jitter , hbase.hregion.majorcompaction + hbase.hregion.majorcompaction * hbase.hregion.majorcompaction.jitter ] <property> <name>hbase.hregion.majorcompaction.jitter</name> <value>0.50</value> </property>
#单个region的大小为10G,当region大于这个值的时候,一个region就会split为两个,适当的增加这个值的大小可以在写操作时减少split操作的发生,从而减少系统性能消耗而增加写操作的性能,默认是10G,官方建议10G~30G <property> <name>hbase.hregion.max.filesize</name> <value>10737418240</value> </property>
#当一个region的memstore总量达到hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size (默认2*128M)时,会阻塞这个region的写操作,并强制刷写到HFile,触发这个刷新操作只会在Memstore即将写满hbase.hregion.memstore.flush.size时put了一个巨大的记录的情况,这时候会阻塞写操作,强制刷新成功才能继续写入 <property> <name>hbase.hregion.memstore.block.multiplier</name> <value>8</value> </property>
#每个单独的memstore的大小(默认128M),这里调成了256M,每个列族columnfamily在每个region中都分配有它单独的memstore,当memstore超过该值时,就会发生flush操作,将memstore中的内容刷成一个hfile,每一次memstore的flush操作,都会为每一次columnfamily创建一个新的hfile;调高该值可以减少flush的操作次数,减少每一个region中的hfile的个数,这样就会减少minor compaction的次数和split的次数,从而降低了系统性能损耗,提升了写性能,也提升了读性能(因为读操作的时候,首先要去memstore中查数据,查找不到的话再去hfile,hflie存储在hdfs中,这就涉及到了对性能要求较高的io操作了)。当然这个值变大了之后,每次flush操作带来的性能消耗也就更大。 <property> <name>hbase.hregion.memstore.flush.size</name> <value>268435456</value> </property>
#mslab特性是在分析了HBase产生内存碎片后的根因后给出了解决方案,这个方案虽然不能够完全解决Full GC带来的问题,但在一定程度上延缓了Full GC的产生间隔,总之减少了内存碎片导致的full gc,提高整体性能。 <property> <name>hbase.hregion.memstore.mslab.enabled</name> <value>true</value> </property>
#当任意一个store中有超过hbase.hstore.blockingStoreFiles个数的storefiles时,这个store所在region的update操作将会被阻塞,除非这个region的compaction操作完成或者hbase.hstore.blockingWaitTime超时。 Block操作会严重影响当前regionserver的响应时间,但过多的storefiles会影响读性能,站在实际使用的角度,为了获取较为平滑的响应时间,可以将该值设得很大,甚至无限大。默认值为7,这里暂时调大到100。 <property> <name>hbase.hstore.blockingStoreFiles</name> <value>100</value> </property>
#一次minor compaction的最大file数 <property> <name>hbase.hstore.compaction.max</name> <value>10</value> </property>
#一次minor compaction的最小file数 <property> <name>hbase.hstore.compactionThreshold</name> <value>4</value> </property>
#本地文件目录用来作为hbase在本地的存储 <property> <name>hbase.local.dir</name> <value>${hbase.tmp.dir}/local</value> </property>
#todo #与前文配置项图中第二红线标注的配置项重复 <property> <name>hbase.master.distributed.log.splitting</name> <value>ture</value> </property>
#hbase master web界面绑定的IP地址(任何网卡的ip都可以访问) <property> <name>hbase.master.info.bindAddress</name> <value>0.0.0.0</value> </property>
#hbase master web界面绑定端口 <property> <name>hbase.master.info.port</name> <value>16010</value> </property>
#todo <property> <name>hbase.master.port</name> <value>16000</value> </property>
#分配1%的regionserver的内存给写操作当作缓存,这个参数和下面的hfile.block.cache.size(读缓存)息息相关,二者之和不能超过总内存的80%,读操作时,该值最好为0,但是这里有个bug,取不到0,所以取值1%即0.01,系统尽可能的把内存给读操作用作缓存 <property> <name>hbase.regionserver.global.memstore.size</name> <value>0.01</value> </property>
#regionserver处理IO请求的线程数,默认是30这里调高到240 <property> <name>hbase.regionserver.handler.count</name> <value>240</value> </property>
#regionserver 信息 web界面接口 <property> <name>hbase.regionserver.info.port</name> <value>16030</value> </property>
#regionserver服务端口 <property> <name>hbase.regionserver.port</name> <value>16020</value> </property>
#todo <property> <name>hbase.regionserver.wal.codec</name> <value>org.apache.hadoop.hbase.regionserver.wal.WALCellCodec</value> </property>
#hbase所有表的文件存放在hdfs中的路径,用户可以在hdfs的web页面和后台命令行中查看,若要彻底删除表,现在hbase中删除,然后在hdfs中删除源文件即可,drop命令运行过后hdfs上内容没有删除情况下。 <property> <name>hbase.rootdir</name> <value>hdfs://node1.dcom:8020/apps/hbase/data</value> </property>
#todo <property> <name>hbase.rpc.protection</name> <value>authentication</value> </property>
#hbase rpc操作超时时间 <property> <name>hbase.rpc.timeout</name> <value>90000</value> </property>
#todo <property> <name>hbase.security.authentication</name> <value>simple</value> </property>
#todo
|