现在的位置: 首页 > 综合 > 正文

hbase优化

2013年06月11日 ⁄ 综合 ⁄ 共 2509字 ⁄ 字号 评论关闭

修改noprc nofile

ubuntu

/etc/security/limits.conf

增加

username soft noproc 32000

username hard noproc 32000

username soft nofile 32768

username hard nofile 32768

在/etc/pam.d/common-session加入

session required pam-limits.so

redhat

/etc/security/limits.conf加入相同内容

在/etc/pam.d/system-auth中加入

session required pam-limits.so

重启机生效

jvm参数

避免jvm stop-the world

两种情况导致cms gc算法值过高,碎片导致

第一种情况,启动参数加入-XX:CMSInitiatingOccupancyFraction=n,n的值小一点,60-70,如果80-90,有太多的young generation被放入tenured generation中,导致 full gc 

第二种情况

hbase.hregion.memstore.mslab.enabled=true放入hbase-site.xml


hbase相关参数
zookeeper.session.timeout
指定master多长时间感知region server 宕机
hbase.regionserver.handler.count
regionserver处理请求的线程数
hbase.hregion.max.filesize
regionserver上region占用的最大存储空间,如果大于该值hbase会将其split成小的region,太小拆分过频繁,太大影响性能。
hfile.block.cache.size
指定storefile的block cache占用heap内存的百分比,影响读的性能
hbase.regionserver.global.memstore.upperLimit
如果memstore的总和达到heap的upperlimit将锁住所有更新,flush所有数据。
hbase.regionserver.global.memstore.lowLimit
如果memstore的总和达到heap的lowlimit,将不flush数据,将选择memstore最大的flush
hbase.hstore.blockingStoreFiles
当store中多于blockingstorefiles个hstorefile,将合并hstorefile,并阻塞update,直到hbase.hstore.blockingWaitTime

hbase.hregion.memstore.block.multiplier

如果memstore的总数是hbase.hregion.flush.size的mulitplier倍则flush数据,并block update

java api

hTable = new HTable(config, table);
            //2 suggestions from http://ryantwopointoh.blogspot.com/2009/01/performance-of-hbase-importing.html
            _hTable.setAutoFlush(false);
            _hTable.setWriteBufferSize(1024*1024*12);

hbase预分配region

默认情况下Hbase创建Table会新建一个region。执行批量导入,意味着所有的client会写入这个region,直到这个region足够大,以至于分裂。一个有效的提高批量导入的性能的方式,是预创建空的region。最好稍保守一点,因为过多的region会实实在在的降低性能。下面是一个预创建region的例子。
(注意:这个例子里需要根据应用的key进行调整。):

public static boolean createTable(HBaseAdmin admin, HTableDescriptor table, byte[][] splits)
throws IOException {
  try {
    admin.createTable( table, splits );
    return true;
  } catch (TableExistsException e) {
    logger.info("table " + table.getNameAsString() + " already exists");
    // the table already exists...
    return false;  
  }
}

public static byte[][] getHexSplits(String startKey, String endKey, int numRegions) {
  byte[][] splits = new byte[numRegions-1][];
  BigInteger lowestKey = new BigInteger(startKey, 16);
  BigInteger highestKey = new BigInteger(endKey, 16);
  BigInteger range = highestKey.subtract(lowestKey);
  BigInteger regionIncrement = range.divide(BigInteger.valueOf(numRegions));
  lowestKey = lowestKey.add(regionIncrement);
  for(int i=0; i < numRegions-1;i++) {
    BigInteger key = lowestKey.add(regionIncrement.multiply(BigInteger.valueOf(i)));
    byte[] b = String.format("%016x", key).getBytes();
    splits[i] = b;
  }
  return splits;
}

hbase regionserver监控http://regionIp:60030



抱歉!评论已关闭.