HBase设计行密钥

时间:2015-03-26 23:36:16

标签: 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

我的第一个方法是:

  • 行键= SSN +日期。
  • 一个有很多列的家庭来存储信息。 (info:cep,info:name,...)

有没有人在这种方法中看到性能问题? 虽然,我的密钥是使用日期组成的,但我认为它不会导致“单调递增值”,因为我首先拥有SSN。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

根据所需的读/写模式,设计很好。 OpenTSDB实际上使用类似schema来存储时间序列数据(用于繁重的实时指标,传感器数据等...)

你确实有单调增加的密钥(给定SSN),但无关紧要有两个原因:

  • 密钥的前导部分是SSN,其基数(~450MM)比节点/区域服务器的数量大。
  • 最重要的是,你每天只写一次!单调增加密钥可能会导致热点,具体取决于您的数据分布和写入模式。执行Bulk Load意味着创建预分割表,生成HFile' offline'并立即加载它们而不通过HBase写入管道(WAL,Memstore,Minor / Major Compactions)。写入时间热点不会发生。

一条小建议:

  • 使用单字符列系列名称: info - > d (如'数据')
相关问题