我用这个TTL创建表:
create "aos:for_test", {NAME => "data", COMPRESSION => "LZO"}, {NUMREGIONS => 240, SPLITALGO => "UniformSplit"}
并将大数据文件(14G附近)导入到表中。即使表有240个区域,客户端报告错误如下:
错误:org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException:失败1822次操作:RegionTooBusyException:1822次
我检查了hbase webUI并发现所有请求只被命中一个区域。我无法弄清楚为什么写请求不能平衡所有区域。
但是,如果我改变这样的TTL:
create "aos:for_test", {NAME => "data", COMPRESSION => "LZO"}, {SPLITS => ['00000','00001','00002','00003','00004','00005','00006','00007','00008','00009','00009p','00009q','00009r','00009s']}
一切正常。
答案 0 :(得分:0)
你有两种解决问题的方法。
首先修改原始密钥,它将是跨区域随机分布的。如果可以通过获取原始密钥的哈希(例如md5 vs murmur哈希函数)并使用由哈希和旧密钥的值组成的新密钥来完成
byte[] newKye = Bytes.add(hashOfOldKeyBytes, oldKeyBytes)
。
第二个varian,随机获取1%的数据并根据它计算密钥分发。然后根据此数据定义区域分割。在java语言下执行此操作的代码片段下方。
byte[][] keys // key from 1% of data
Collections.sort(splitList, new Comparator<byte[]>() {
@Override
public int compare(byte[] o1, byte[] o2) {
return Bytes.compareTo(o1, o2);
}
});
byte[][] splitKeys = new byte[numberOfRegions][];
for (int i = 0; i < numberOfRegions; i++) {
splitKeys[i] = keys[(i + 1) * keys.length / (numberOfRegions + 1)];
}
admin.createTable(tableDescriptor, splitKeys);