rowkey的设计及Rowkey如何匹配分配到各个分区上?

刚开始,新创建的表预分区:如图所示

988166-20170612131636478-819842950.png

然后插入数据

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;

public class InsertDateToTable {
public static void main(String[] args) {
    String tableName = "lzpTest";
    
    Configuration conf = new Configuration();
    conf.set("hbase.zookeeper.quorum","改成zookeeper节点");
    
    HTable hTable=null;
    HBaseAdmin admin = null;
    try {
        admin = new HBaseAdmin(conf);
        
        hTable = new HTable(conf, tableName);
    
        //插入一条数据到hbase表中
        Put put = new Put(Bytes.toBytes(10+System.currentTimeMillis()+"-"+111));
        put.add("cf1".getBytes(), "name".getBytes(), "lzp".getBytes());
        hTable.put(put);
        //批插入数据到hbase表中
 //         hTable.put(batchPut(10000));
        System.out.println("插入成功!");
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("插入失败!");
    } finally {
        if(hTable!=null) {
            try {
                hTable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if(admin!=null) {
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
/**
 * 产生随机数用于拼接Rowkey前缀
 * @return
 */
public static String getRandomNumber() {
    String ranStr = Math.random()+"";
    int index = ranStr.indexOf(".");
    return ranStr.substring(index+1, index+3);
}

/**
 * 批插入数据
 * @param num
 * @return
 */
public static List<Put> batchPut(int num) {
    System.out.println("开始插入数据。。。。");
    List<Put> list = new ArrayList<>();
    System.out.println("插入:"+num+" 数据!");
    for(int i =0;i<num;i++) {
        //Rowkey组成:随机数+"-"+当前系统时间+"-"+i
        byte[] rowkey = Bytes.toBytes(getRandomNumber()+"-"+System.currentTimeMillis()+"-"+i);
        Put put = new Put(rowkey);
        put.add(Bytes.toBytes("cf1"), Bytes.toBytes("name"), Bytes.toBytes("lzp"+i));
        list.add(put);
    }
    return list;
}
}

单独插入一条数据:“10+"-"+系统时间当前时间+"-"+111”
988166-20170612132637571-1454601113.png

通过hbase web UI看到,我们的数据插入到了对应的分区中;

通过scan "lzpTest"查看数据:Rowkey是以10开头,并且插入到了以10结尾(StopKey=10)的分区中;

988166-20170612132648603-1008192030.png

因此:我们可以这样简单理解,我们的分区stopkey是两位数,也只匹配Rowkey的前两位数(从高位开始匹配);

调用该方法,批量插入数据,查看是否存在热点问题,

hTable.put(batchPut(10000));

结果如下:

988166-20170612133606743-257776915.png

基本上均匀分布在各个节点上;从而很好的解决了热点问题的发生;

转载于:https://www.cnblogs.com/xihongxiaoshi/p/6992589.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值