hbase优化

2018/04/25

参数设置

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://cdh-master:8020/hbase</value>
  </property>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.client.write.buffer</name>
    <value>2097152</value>
  </property>
  <property>
    <name>hbase.client.pause</name>
    <value>100</value>
  </property>
  <property>
    <name>hbase.client.retries.number</name>
    <value>35</value>
  </property>
  <property>
    <name>hbase.client.scanner.caching</name>
    <value>100</value>
  </property>
  <property>
    <name>hbase.client.keyvalue.maxsize</name>
    <value>10485760</value>
  </property>
  <property>
    <name>hbase.ipc.client.allowsInterrupt</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.client.primaryCallTimeout.get</name>
    <value>10</value>
  </property>
  <property>
    <name>hbase.client.primaryCallTimeout.multiget</name>
    <value>10</value>
  </property>
  <property>
    <name>hbase.splitlog.manager.timeout</name>
    <value>120000</value>
  </property>
  <property>
    <name>hbase.regionserver.port</name>
    <value>60020</value>
  </property>
  <property>
    <name>hbase.regionserver.ipc.address</name>
    <value>0.0.0.0</value>
  </property>
  <property>
    <name>hbase.regionserver.info.port</name>
    <value>60030</value>
  </property>
  <property>
    <name>hbase.client.scanner.timeout.period</name>
    <value>600000</value>
  </property>
  <property>
    <name>hbase.regionserver.handler.count</name> # 该设置决定了处理RPC的线程数量,默认值是10,通常可以调大,比如:150,当请求内容很大(上MB,比如大的put、使用缓存的scans)的时候,如果该值设置过大则会占用过多的内存,导致频繁的GC,或者出现OutOfMemory,因此该值不是越大越好。
    <value>30</value>
  </property>
  <property>
    <name>hbase.regionserver.metahandler.count</name>
    <value>10</value>
  </property>
  <property>
    <name>hbase.regionserver.msginterval</name>
    <value>3000</value>
  </property>
  <property>
    <name>hbase.regionserver.optionallogflushinterval</name>
    <value>1000</value>
  </property>
  <property>
    <name>hbase.regionserver.regionSplitLimit</name>
    <value>2147483647</value>
  </property>
  <property>
    <name>hbase.regionserver.logroll.period</name>
    <value>3600000</value>
  </property>
  <property>
    <name>hbase.regionserver.nbreservationblocks</name>
    <value>4</value>
  </property>
  <property>
    <name>hbase.regionserver.global.memstore.upperLimit</name> # 默认值0.4,RS所有memstore占用内存在总内存中的upper比例,当达到该值,则会从整个RS中找出最需要flush的region进行flush,直到总内存比例降至该数限制以下,并且在降至限制比例以下前将阻塞所有的写memstore的操作,在以写为主的集群中,可以调大该配置项,不建议太大,因为block cache和memstore cache的总大小不会超过0.8,而且不建议这两个cache的大小总和达到或者接近0.8,避免OOM,在偏向写的业务时,可配置为0.45,memstore.lowerLimit保持0.35不变,在偏向读的业务中,可调低为0.35,同时memstore.lowerLimit调低为0.3,或者再向下0.05个点,不能太低,除非只有很小的写入操作,如果是兼顾读写,则采用默认值即可。
    <value>0.4</value> 
  </property>
  <property>
    <name>hbase.regionserver.global.memstore.lowerLimit</name> # 默认值0.35,RS的所有memstore占用内存在总内存中的lower比例,当达到该值,则会从整个RS中找出最需要flush的region进行flush,配置时需结合memstore.upperLimit和block cache的配置。
    <value>0.38</value>
  </property>
  <property>
    <name>hbase.regionserver.codecs</name>
    <value></value>
  </property>
  <property>
    <name>hbase.regionserver.maxlogs</name>
    <value>32</value>
  </property>
  <property>
    <name>hbase.regionserver.hlog.blocksize</name>
    <value>134217728</value>
  </property>
  <property>
    <name>hbase.regionserver.thread.compaction.small</name>
    <value>1</value>
  </property>
  <property>
    <name>hbase.ipc.server.read.threadpool.size</name>
    <value>10</value>
  </property>
  <property>
    <name>hbase.wal.regiongrouping.numgroups</name>
    <value>1</value>
  </property>
  <property>
    <name>hbase.wal.provider</name>
    <value>multiwal</value>
  </property>
  <property>
    <name>hbase.wal.storage.policy</name>
    <value>NONE</value>
  </property>
  <property>
    <name>hbase.hregion.memstore.flush.size</name> # 默认值128M,单位字节,超过将被flush到hdfs,该值比较适中,一般不需要调整。
    <value>134217728</value>
  </property>
  <property>
    <name>hbase.hregion.memstore.mslab.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.hregion.memstore.mslab.chunksize</name>
    <value>2097152</value>
  </property>
  <property>
    <name>hbase.hregion.memstore.mslab.max.allocation</name>
    <value>262144</value>
  </property>
  <property>
    <name>hbase.hregion.preclose.flush.size</name>
    <value>5242880</value>
  </property>
  <property>
    <name>hbase.hregion.memstore.block.multiplier</name> # 默认值2,如果memstore的内存大小已经超过了hbase.hregion.memstore.flush.size的2倍,则会阻塞memstore的写操作,直到降至该值以下,为避免发生阻塞,最好调大该值,比如:4,不可太大,如果太大,则会增大导致整个RS的memstore内存超过memstore.upperLimit限制的可能性,进而增大阻塞整个RS的写的几率。如果region发生了阻塞会导致大量的线程被阻塞在到该region上,从而其它region的线程数会下降,影响整体的RS服务能力,例如:开始阻塞: 解开阻塞: 从10分11秒开始阻塞到10分20秒解开,总耗时9秒,在这9秒中无法写入,并且这期间可能会占用大量的RS handler线程,用于其它region或者操作的线程数会逐渐减少,从而影响到整体的性能,也可以通过异步写,并限制写的速度,避免出现阻塞。
    <value>2</value>
  </property>
  <property>
    <name>hbase.hregion.max.filesize</name> # 配置region大小,0.94.12版本默认是10G,region的大小与集群支持的总数据量有关系,如果总数据量小,则单个region太大,不利于并行的数据处理,如果集群需支持的总数据量比较大,region太小,则会导致region的个数过多,导致region的管理等成本过高,如果一个RS配置的磁盘总量为3T*12=36T数据量,数据复制3份,则一台RS服务器可以存储10T的数据,如果每个region最大为10G,则最多1000个region,如此看,94.12的这个默认配置还是比较合适的,不过如果要自己管理split,则应该调大该值,并且在建表时规划好region数量和rowkey设计,进行region预建,做到一定时间内,每个region的数据大小在一定的数据量之下,当发现有大的region,或者需要对整个表进行region扩充时再进行split操作,一般提供在线服务的hbase集群均会弃用hbase的自动split,转而自己管理split。
    <value>10737418240</value>
  </property>
  <property>
    <name>hbase.hregion.majorcompaction.jitter</name>
    <value>0.5</value>
  </property>
  <property>
    <name>hbase.region.replica.replication.enabled</name>
    <value>false</value>
  </property>
  <property>
    <name>hbase.hstore.compactionThreshold</name> # HStore的storeFile数量>= compactionThreshold配置的值,则可能会进行compact,默认值为3,可以调大,比如设置为6,在定期的major compact中进行剩下文件的合并。
    <value>3</value>
  </property>
  <property>
    <name>hbase.hstore.blockingStoreFiles</name> # HStore的storeFile的文件数大于配置值,则在flush memstore前先进行split或者compact,除非超过hbase.hstore.blockingWaitTime配置的时间,默认为7,可调大,比如:100,避免memstore不及时flush,当写入量大时,触发memstore的block,从而阻塞写操作。
    <value>10</value>
  </property>
  <property>
    <name>hbase.hstore.blockingWaitTime</name>
    <value>90000</value>
  </property>
  <property>
    <name>hbase.hregion.majorcompaction</name> # 配置major合并的间隔时间,默认为1天,可设置为0,禁止自动的major合并,可手动或者通过脚本定期进行major合并,有两种compact:minor和major,minor通常会把数个小的相邻的storeFile合并成一个大的storeFile,minor不会删除标示为删除的数据和过期的数据,major会删除需删除的数据,major合并之后,一个store只有一个storeFile文件,会对store的所有数据进行重写,有较大的性能消耗。
    <value>604800000</value>
  </property>
  <property>
    <name>hfile.block.cache.size</name> # RS的block cache的内存大小限制,默认值0.25,在偏向读的业务中,可以适当调大该值,具体配置时需试hbase集群服务的业务特征,结合memstore的内存占比进行综合考虑。
    <value>0.4</value>
  </property>
  <property>
    <name>hbase.hash.type</name>
    <value>murmur</value>
  </property>
  <property>
    <name>hbase.server.thread.wakefrequency</name>
    <value>10000</value>
  </property>
  <property>
    <name>hbase.coprocessor.abortonerror</name>
    <value>false</value>
  </property>
  <property>
    <name>hbase.coprocessor.region.classes</name>
    <value>org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint,org.apache.hadoop.hbase.coprocessor.transactional.TrxRegionObserver,org.apache.hadoop.hbase.coprocessor.transactional.TrxRegionEndpoint,org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
  </property>
  <property>
    <name>hbase.superuser</name>
    <value></value>
  </property>
  <property>
    <name>hbase.rpc.timeout</name>
    <value>60000</value>
  </property>
  <property>
    <name>hbase.snapshot.master.timeoutMillis</name>
    <value>60000</value>
  </property>
  <!--'hbase.snapshot.region.timeout', originally set to '60000' (non-final), is overridden below by a safety valve-->
  <property>
    <name>hbase.snapshot.master.timeout.millis</name>
    <value>60000</value>
  </property>
  <property>
    <name>hbase.security.authentication</name>
    <value>simple</value>
  </property>
  <property>
    <name>hbase.security.authorization</name>
    <value>false</value>
  </property>
  <property>
    <name>hbase.row.level.authorization</name>
    <value>false</value>
  </property>
  <property>
    <name>hbase.rpc.protection</name>
    <value>authentication</value>
  </property>
  <property>
    <name>zookeeper.session.timeout</name>
    <value>60000</value>
  </property>
  <property>
    <name>zookeeper.znode.parent</name>
    <value>/hbase</value>
  </property>
  <property>
    <name>zookeeper.znode.rootserver</name>
    <value>root-region-server</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>cdh-slave3,cdh-master,cdh-slave2</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
  </property>
  <!--'hbase.bulkload.staging.dir', originally set to '/tmp/hbase-staging' (non-final), is overridden below by a safety valve-->
  <property>
    <name>hbase.hregion.impl</name>
    <value>org.apache.hadoop.hbase.regionserver.transactional.TransactionalRegion</value>
  </property>
  <property>
    <name>hbase.regionserver.region.split.policy</name>
    <value>org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy</value>
  </property>
  <property>
    <name>hbase.snapshot.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.bulkload.staging.dir</name>
    <value>/hbase-staging</value>
  </property>
  <property>
    <name>hbase.regionserver.region.transactional.tlog</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.snapshot.region.timeout</name>
    <value>600000</value>
  </property>
</configuration>

目录