HBase在线系统性能优化

来源:互联网 发布:如何在终端退出python 编辑:程序博客网 时间:2024/05/18 09:18

一、手工进行Major Compaction

实时系统最好关闭HBase的自动Major Compaction,HBase在进行Major Compaction时会合并所有的存储文件,整个Region都不可用。HBase默认大约每天执行一次Compaction,最好把自动Compaction禁用,采用crontab在闲时触发执行。

修改HBase配置:

<property>
  <name>hbase.hregion.majorcompaction</name>
  <value>0</value>
</property>

将时间设置为0,禁用自动Major Compaction。

在HBase Shell中执行脚本:

major_compact ‘table_name’

这样就能手工执行一次Major Compaction。将所有的表名称写成一个文件,然后在shell脚本中遍历这个文件,执行HBase Shell命令,就可以定时自动执行了。

for table in $(cat $TABLES_FILE); do
  echo “major_compact ‘$table'” | $HBASE_HOME/bin/hbase shell
  sleep 10
done

写成shell,设置一下crontab,每天夜深人静的时候跑一下就可以了。

二、手工进行Split 

建议关闭HBase的自动Split,夜深人静业务量小的时候手工Split。

要关闭自动split,需要调整 “hbase.hregion.max.filesize” 参数。不建议把这个参数设置成Long.MAX_VALUE,万一忘记了做手工split会出麻烦的。可以把这个值设置成100G,100G的文件split大约需要1小时的时间。

<property> 
  <name>hbase.hregion.max.filesize</name> 
  <value>107374182400</value> 
</property>

具体调成什么值要看系统的数据量,要调一个每天的数据量不可能达到、定时器万一失灵也不会造成麻烦的值。

三、设置blockingStoreFiles

转自:http://www.cfanz.cn/index.php?c=article&a=read&id=62909

这个参数的重要性是在我们的性能测试中发现的。我们禁掉major_compaction和split后理论上写入应该无障碍了,但在测试中发现写入单个region速度大于10M/s时还是会出现长时间无法写入的情况。通过查看log,我们发现了这行log“Waited 90314ms on a compaction to clean up ‘too many store  files‘”,通过查看代码发现原来是blockingStoreFiles这个参数在作怪。

在flushRegion时会检测当前store中hfile的数量是否大于此值,如果大于则会block数据的写入,等待其他线程将hfile compact掉。这样,如果写入速度超过compact的速度,hbase就会阻止该region的数据写入。

private boolean flushRegion(final FlushRegionEntry fqe) {
  HRegion region = fqe.region;
  if (!fqe.region.getRegionInfo().isMetaRegion() && isTooManyStoreFiles(region)) { 
    if (fqe.isMaximumWait(this.blockingWaitTime)) { 
      LOG.info(“Waited ” + (System.currentTimeMillis() – fqe.createTime) + “ms on a compaction to clean up ‘too many store files'; waited ” + “long enough… proceeding with flush of ” + region.getRegionNameAsString()); 
    }

默认值为7

  this.blockingStoreFilesNumber = conf.getInt(“hbase.hstore.blockingStoreFiles”, 7); 
  if (this.blockingStoreFilesNumber == -1) { 
    this.blockingStoreFilesNumber = 1 + conf.getInt(“hbase.hstore.compactionThreshold”, 3);
  }

我们将此值设为很大的值,使得此问题不会block我们的写入。

<property> 
  <name>hbase.hstore.blockingStoreFiles</name> 
  <value>2100000000</value>
</property>

0 0