hadoop - Hbase 区域请求不平衡

标签 hadoop hbase

我使用这个 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/

相关文章:

hadoop - 读取数据为 "streaming fashion"是什么意思?

hadoop - 如何在 Hive 0.13 中更新表?

performance - 我应该在 HBase 中使用 prefixfilter 还是 rowkey 范围扫描

hadoop - hbase 区域服务器未与主服务器通信

nosql - 如何根据 HBase shell 中的行模式扫描行?

hadoop - 为什么 MapReduce 作业没有完全加载附加文件?

hadoop - oozie 工作流属性中的 XML 特殊字符

输出键为 NullWritable 时的 Hadoop reducer 输出顺序

hadoop - 同一 HBase 集群内的随机读取和扫描

java - 重启后Hbase数据被删除