分享

HBase 0.94之后Split策略

desehawk 2015-1-14 01:04:14 发表于 总结型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 22067

问题导读

1.而在0.94版本之后,默认split策略修改为了什么?
2.这种策略有什么好处?






HBase 0.94中的Split策略
HBase 0.94之前版本中,split使用的是ConstantSizeRegionSplitPolicy。当region中文件大小超过配置中所指定大小时,会进行切分。
而在0.94版本之后,默认split策略修改为了IncreasingToUpperBoundRegionSplitPolicy。该策略使用了另一种方法来计算是否应当切割,导致原先的参数失效。
该方法中的分配策略,是根据table中region的个数平方,乘以memstore的大小。得出应当切分的大小。
假设memstore size配置为128M,则在memstore第一次刷入HFile数据时,进行第一次split,1 * 1 * 128M = 128M。
当region数达到2个时,2 * 2 * 128M = 512M。
当region数达到3个时,3 * 3 * 128M = 1152M。
依此类推。
当region个数到达30个时,30 * 30 * 128 = 107648M = 105.1G。即在此时,region的切分大小已经超过了我们原先在ConstantSizeRegionSplitPolicy策略中设置的100G大小。
简单分析
对这种策略进行简单的分析,可以看到,在数据写入初期,这种策略可以快速的对现有region进行split,使得在一开始就可以将热点region切分到多个server上。同时由于region size较小,也可以避免split操作对写入的阻塞。
而在后期,当region数量逐渐增多,单个region size逐渐增大时,split频率会急速减少,避免在region过大时频繁split的情况。
这种策略一方面在数据量增大的情况下减少了region的切分次数,达到了我们期望的尽量减少split的需求,避免对写入造成影响。同时在初期的快速切分,在基本不影响写入的同时,也减少了我们原先需要手动操作split的问题。可以认为,这种策略是符合我们需求的。当然,还需要进一步的测试来进行验证。
源码
源码如下:
  1. /**
  2. * @return Region max size or <code>count of regions squared * flushsize, which ever is
  3. * smaller; guard against there being zero regions on this server.
  4. */
  5. long getSizeToCheck(final int tableRegionsCount) {
  6.   return tableRegionsCount == 0? getDesiredMaxFileSize():
  7.     Math.min(getDesiredMaxFileSize(),
  8.       this.flushSize * (tableRegionsCount * tableRegionsCount));
  9. }
  10.   
  11. @Override
  12. protected boolean shouldSplit() {
  13.   if (region.shouldForceSplit()) return true;
  14.   boolean foundABigStore = false;
  15.   // Get count of regions that have the same common table as this.region
  16.   int tableRegionsCount = getCountOfCommonTableRegions();
  17.   // Get size to check
  18.   long sizeToCheck = getSizeToCheck(tableRegionsCount);
  19.   
  20.   for (Store store : region.getStores().values()) {
  21.     // If any of the stores is unable to split (eg they contain reference files)
  22.     // then don't split
  23.     if ((!store.canSplit())) {
  24.       return false;
  25.     }
  26.   
  27.     // Mark if any store is big enough
  28.     long size = store.getSize();
  29.     if (size > sizeToCheck) {
  30.       LOG.debug("ShouldSplit because " + store.getColumnFamilyName() +
  31.         " size=" + size + ", sizeToCheck=" + sizeToCheck +
  32.         ", regionsWithCommonTable=" + tableRegionsCount);
  33.       foundABigStore = true;
  34.       break;
  35.     }
  36.   }
  37.   
  38.   return foundABigStore;
  39. }
复制代码











已有(2)人评论

跳转到指定楼层
pengsuyun 发表于 2015-1-14 17:28:30
回复

使用道具 举报

Riordon 发表于 2015-9-16 09:54:36
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条