HBase设计行键

HBase设计行键,hbase,row,nosql,Hbase,Row,Nosql,我有大约20亿的事件。事件包括:一个密钥(SSN)、一个日期和有关事件的信息。 我有5种类型的活动 读取模式:我需要从一个键中获取少于特定日期的所有事件 写入模式:每天只需一次批量加载 想象一下数据库: SSN;date(yyyymmdd);info 1;20140101;A 1;20140105;B 2;20140106;A 1;20140103;C 因此,如果我的查询是:(SSN=“1”和date=“20140104”),我需要得到: 1;20140101;A 1;20140103;C

我有大约20亿的事件。事件包括:一个密钥(SSN)、一个日期和有关事件的信息。 我有5种类型的活动

读取模式:我需要从一个键中获取少于特定日期的所有事件

写入模式:每天只需一次批量加载

想象一下数据库:

SSN;date(yyyymmdd);info
1;20140101;A
1;20140105;B
2;20140106;A
1;20140103;C
因此,如果我的查询是:(SSN=“1”和date=“20140104”),我需要得到:

1;20140101;A
1;20140103;C
我的第一个方法是:

  • 行键=SSN+日期
  • 一个具有多个列以存储信息的族。(信息:cep,信息:姓名,…)
有人认为这种方法存在性能问题吗?
虽然我的密钥是用日期组成的,但我认为它不会导致“单调递增的值”,因为我首先有一个SSN。

这是一个完美的设计。对于读取扫描,您将使用startKey=sss+0和endKey=ssn+date。您需要为用户标识符字段(SSN-9)分配固定数量的符号。行键按字典顺序排序。20 bln/420循环中的总SSN=每个SSN 47个事件,假设分布均匀。这并不多,但我会考虑索引大小和所需的任何优化


事件是时间序列。您可能对以下摘要感兴趣。它有3个用例:

给定所需的读/写模式,设计很好。实际使用类似的存储timeseries数据(用于重实时度量、传感器数据等…)

您确实有单调递增的键(给定SSN),但这并不重要,原因有两个:

  • 密钥的主要部分是SSN,其基数(~450MM)远大于节点/区域服务器的数量
  • 最重要的是,你每天只写一次!根据您的数据分布和写入模式,单调增加键可能会导致热点。这样做意味着创建一个预拆分的表,以“脱机”方式生成HFiles,并在不经过HBase写入管道(WAL、Memstore、次要/主要压缩)的情况下一次性加载它们。写入时间热点无法发生
一条小建议:

  • 使用单字符列族名称:info->d(如“数据”中)