Hadoop Hbase区域请求不平衡
我使用此TTL创建表:Hadoop Hbase区域请求不平衡,hadoop,hbase,Hadoop,Hbase,我使用此TTL创建表: create "aos:for_test", {NAME => "data", COMPRESSION => "LZO"}, {NUMREGIONS => 240, SPLITALGO => "UniformSplit"} 并将一个大数据文件(接近14G)导入表中。尽管该表有240个区域,但客户端报告的错误如下: 错误:org.apache.hadoop.hbase.client.RetriesHaustedWithDetails异常:失败182
create "aos:for_test", {NAME => "data", COMPRESSION => "LZO"}, {NUMREGIONS => 240, SPLITALGO => "UniformSplit"}
并将一个大数据文件(接近14G)导入表中。尽管该表有240个区域,但客户端报告的错误如下:
错误:org.apache.hadoop.hbase.client.RetriesHaustedWithDetails异常:失败1822操作:RegionToBusYeException: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']}
一切正常。你有两种解决问题的方法 首先修改原始密钥,使其随机分布在各个区域。如果可以通过获取原始密钥的散列(例如md5与杂音散列函数)并使用由散列和旧密钥的值组成的新密钥来实现,如下所示
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);
byte[][]键//从1%的数据中键入
Collections.sort(splitList,newcomparator(){
@凌驾
公共整数比较(字节[]o1,字节[]o2){
返回字节。比较(o1,o2);
}
});
字节[][]拆分键=新字节[numberOfRegions][];
对于(int i=0;i
您有两种解决问题的方法
首先修改原始密钥,使其随机分布在各个区域。如果可以通过获取原始密钥的散列(例如md5与杂音散列函数)并使用由散列和旧密钥的值组成的新密钥来实现,如下所示
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);
byte[][]键//从1%的数据中键入
Collections.sort(splitList,newcomparator(){
@凌驾
公共整数比较(字节[]o1,字节[]o2){
返回字节。比较(o1,o2);
}
});
字节[][]拆分键=新字节[numberOfRegions][];
对于(int i=0;i
配置了什么区域分割策略?如果是ConstantSizeRegionSplitPolicy,则所有请求都将转到同一区域,直到达到阈值大小。我没有配置策略。我不知道默认值是什么。从HBase 0.94+,默认区域分割策略将增加到UpperBoundRegionSplitPolicy。请验证hbase-site.xml中的hbase.hregion.max.filesize属性值。有关更多详细信息,请参阅hbase.hregion.max.filesize为512M,memstore.flush.size为64M,我检查reginserver日志,其中包含许多信息,如“[B.defaultRpcServer.handler=33,queue=3,port=60020]regionserver.MemStoreFlusher:阻止datanodetest01.hadoop.ebj.elong.com上的更新,60020144524980310:全局memstore大小358.0 M大于阻止355.6 M”。另外,从用户界面上我可以看到,这个表一直在做主要的压缩。我已经阅读了文档。有一句话类似于“无论您选择何种方法来创建具有预先确定的区域数的表,您现在都可以开始将数据加载到表中,并看到负载分布在整个集群中。”尽管我仍然感到困惑…配置了什么区域分割策略?如果是ConstantSizeRegionSplitPolicy,则所有请求都将转到同一区域,直到达到阈值大小。我没有配置策略。我不知道默认值是什么。从HBase 0.94+,默认区域分割策略将增加到UpperBoundRegionSplitPolicy。请验证hbase-site.xml中的hbase.hregion.max.filesize属性值。有关更多详细信息,请参阅hbase.hregion.max.filesize为512M,memstore.flush.size为64M,我检查reginserver日志,其中包含许多信息,如“[B.defaultRpcServer.handler=33,queue=3,port=60020]regionserver.MemStoreFlusher:阻止datanodetest01.hadoop.ebj.elong.com上的更新,60020144524980310:全局memstore大小358.0 M大于阻止355.6 M”。另外,从用户界面上我可以看到,这个表一直在做主要的压缩。我已经阅读了文档。有一句话类似于“无论您选择何种方法来创建具有预先确定的区域数的表,您现在都可以开始将数据加载到表中,并看到负载分布在整个集群中。”尽管我仍然感到困惑。。。