hbase读写性能测试调优_初稿


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

 

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值