【问题标题】:Designing composite rowkey for Hbase为 Hbase 设计复合行键
【发布时间】:2018-02-13 06:52:25
【问题描述】:

我正在尝试创建具有以下结构的 hbase 表。

**rowkey**                  |**CF1**
(customerid,txtimestamp)|customerid,amount
  1. 我想使用customerid查询特定时期范围内的记录。
  2. 我的 rowkey 以相反的顺序使用客户 ID 和交易时间戳。

Long customerid=Long.valueOf(new StringBuilder(customerid).reverse().toString());

byte[] rowKey = Bytes.add(Bytes.toBytes(customerid),Bytes.toBytes(txttimestamp.getTime()));

  1. 如何设计行键以便将其拆分为 4 个区域服务器?
  2. 有没有高效的行键设计方法?

【问题讨论】:

    标签: hadoop hbase


    【解决方案1】:

    customer_id不用倒过来,没意义

    如果要将所有数据拆分到 4 个区域,可以在所有键前面加上值 0-3,例如:

    int partition = customer_id % 4;
    byte[] rowKey = Bytes.add(
                       Bytes.toBytes(String.valueOf(partition)),
                       Bytes.toBytes(String.valueOf(customer_id)),
                       Bytes.toBytes(txTimestamp.getTime())
                    );
    

    在这种情况下,您需要使用此 HBaseAdmin 方法创建带有拆分键的表

    public void createTable(final HTableDescriptor desc, byte [][] splitKeys)
    

    拆分键是:

    byte[][] splitKeys = new byte[3][];
    splitKeys[0] = "1".getBytes();
    splitKeys[1] = "2".getBytes();
    splitKeys[2] = "3".getBytes();
    

    所以所有以 0 开头的键都进入第一个区域,以 1 开头的键进入第二个区域,依此类推

    【讨论】:

    • 我们可以在 hbase shell 中指定 split 吗?另外,如果我们使用 ascii 而不是 bytes 作为 splitkeys 呢?
    • @kinkajou 对于 1 个问题,请参阅 stackoverflow.com/questions/14863285
    • @kinkajou hbase 密钥比较器比较原始字节,选择分区时请记住这一点
    • 我现在得到了超过 3 个服务器的分区。实际上,我正在使用第一台服务器 0、第二台服务器 1、第二台服务器 2、第三台服务器 3、第四台服务器。这是科学吗?
    • @kinkajou 我明白了。正如预期的那样,您有 4 个区域,但 hbase 决定将其中两个放在同一台服务器上。有一种方法可以手动将区域分配给服务器。这是一个sn-p gist.github.com/sergey-sw/4ced9399b6df711c0cbfb35b0f69763f
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多