hadoop-Hbase区域请求不平衡


0

我使用此TTL创建表:

create "aos:for_test", {NAME => "data", COMPRESSION => "LZO"}, {NUMREGIONS => 240, SPLITALGO => "UniformSplit"}

并将一个大数据文件(接近14G)导入表中。尽管该表有240个区域,但 client报告错误如下:

错误:org.apache.hadoop下载.hbase.client.retriesHaustedWithDetailsException异常:1822操作失败:RegionToBusyException: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']}

一切正常。

1 答案


0

你有两种解决问题的方法。

首先修改原始密钥,使其随机分布于各个区域。如果可以通过获取原始密钥的散列(例如md5与杂音散列函数)并使用由散列和旧密钥的值组成的新密钥来实现,如下所示

字节[]newKye=字节.添加(hashOfOldKeyBytes,oldKeyBytes)。

第二个varian,随机抽取1%的数据,并在此基础上计算密钥分布。然后 root据这些数据定义一个区域分割。下面是在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);


我来回答

写文章

提问题

面试题