大家都知道HBase的一个重要特性就是split,split通常情况下是自动执行的,而trigger条件就是region的size到达一定大小。那么到底这个大小是多少纳?
笔者google了一些文章,不少文章说是256M,但也有一些说是1G。那么到底是多少纳?
HBase是支持设置Table级别的splitsize的,HTableDescriptor类里读取FileSize的代码如下:
public long getMaxFileSize() {
byte [] value = getValue(MAX_FILESIZE_KEY);
if (value != null)
return Long.valueOf(Bytes.toString(value)).longValue();
return HConstants.DEFAULT_MAX_FILE_SIZE;
}
默认的FileSize来自HConstant类:
/** Default maximum file size */
public static final long DEFAULT_MAX_FILE_SIZE = 1024 * 1024 * 1024;
因此默认的SplitSize是1G。
那么再看下check RegionSize的类是怎么检查的:
void configureForRegion(HRegion region) {
super.configureForRegion(region);
long maxFileSize = region.getTableDesc().getMaxFileSize();
// By default we split region if a file > HConstants.DEFAULT_MAX_FILE_SIZE.
if (maxFileSize == HConstants.DEFAULT_MAX_FILE_SIZE) {
maxFileSize = getConf().getLong("hbase.hregion.max.filesize",
HConstants.DEFAULT_MAX_FILE_SIZE);
}
this.desiredMaxFileSize = maxFileSize;
}
1.拿到当前region的表的MaxFileSize
2.如果等于默认值则选择默认值,在此处代码可知配置文件里改region split size的key名是:hbase.hregion.max.filesize。
3.如果不等于默认值则选择已指定的值
至于网上很多朋友说是256M,那是因为在0.92.0版本之后的一次改动中将此值从原来的256M改到了1G。因此~很多文档要更新下拉~