我使用这个 TTL 来创建表:
create "aos:for_test", {NAME => "data", COMPRESSION => "LZO"}, {NUMREGIONS => 240, SPLITALGO => "UniformSplit"}
并导入一个大数据文件(近14G)到表中。即使表有240个region,客户端报错如下:
Error: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 1822 actions: RegionTooBusyException: 1822 times
我检查了 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']}
一切正常。
最佳答案
您有两种解决问题的方法。
首先修改raw key,让它跨区域随机分布。如果可以通过获取原始 key 的哈希值(例如 md5 与 murmur 哈希函数)并使用由哈希值和旧 key 的值组成的新 key 来完成,就像这样
byte[] newKye = Bytes.add(hashOfOldKeyBytes, oldKeyBytes)
。
第二个变体,随机抽取 1% 的数据并以此为基础计算 key 分布。然后根据这些数据定义区域分割。下面是一个代码片段,用于在 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);
关于hadoop - Hbase 区域请求不平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33216594/