【问题标题】:HBase shell - Model and retrieve data for historical data and audit informationHBase shell - 为历史数据和审计信息建模和检索数据
【发布时间】:2014-01-25 06:30:36
【问题描述】:

我正在寻找有关 HBase 的帮助(对它来说还很新,并试图了解我是否可以将它用于我的 POC)。

用例: 我需要一个历史价格数据表,例如将存储 10 个不同索引的数据。其中一项要求是跟踪或审计对成分股或股票或工具的任何属性所做的更改。 另外,如果我想找到在 2010 年 1 月的月份中价格变化差异为 n% 的工具列表。

数据例如(一些可能性) (下面提到的列只是为了说明)

    date instrument high low mid user ts
    20130101 goog 34 33.4 33.8 system 10:30
    20130101 yhoo 24 23.4 23.8 system 10:50
    20130101 goog 34.1 33.3 33.8 ops 10:55
    20130101 msft 134 133.4 133.8 system 11:00
    20130101 msft 134 133.9 133.8 ops 11:30
    20130101 goog 34.1 33.3 34.1 ops 11:30
    20130101 aapl 48 48.4 47.9 system 11:30

类似的数据将用于后续日期。请注意,一天之内,任何用户都可能更改工具的属性/属性值(如 goog、msft 所示),而有些用户则完全没有变化(aapl、yhoo)。

我可以用来存储这些数据并且从中检索也很容易的最佳数据模型是什么?

如果 HBase 有复合行键(如果有,请帮助我使用语法),那么我可以有类似的东西,

    ROW                          COLUMN+CELL                        
    goog-20130101                 column=cf1:h1, timestamp=1389020633920, value=34
    goog-20130101                 column=cf1:h2, timestamp=1389020654614, value=34.1
    goog-20130101                 column=cf1:h3, timestamp=1389020668338, value=34.1
    goog-20130101                 column=cf1:l1, timestamp=1389020633920, value=33.4
    goog-20130101                 column=cf1:l2, timestamp=1389020654614, value=33.8
    goog-20130101                 column=cf1:l3, timestamp=1389020668338, value=33.3
    goog-20130101                 column=cf1:u1, timestamp=1389020633920, value=system
    goog-20130101                 column=cf1:u2, timestamp=1389020654614, value=ops
    goog-20130101                 column=cf1:u3, timestamp=1389020668338, value=ops

    aapl-20130101                 column=cf1:h1, timestamp=1389020633920, value=48
    aapl-20130101                 column=cf1:l1, timestamp=1389020633920, value=48.4
    aapl-20130101                 column=cf1:u1, timestamp=1389020633920, value=system

1) 我们可以创建这样的行键吗?如何? 2)如果 rowkey 的数据已经存在(goog-20130101),例如那么在我们的例子中,我们如何将数据通知/放入相同的行键但列名更改为 h1、l1、u1?随后到 h2、l2 等。这是可以实现的吗? 3) 如何检索最新数据及其值(在约会时为 goog 打个招呼)?

或者,如果有人遇到过此类数据(您可以在其中跟踪用户/对象的多个事件/活动一天并存储任何内容),可以就适合 HBase 的更好模型提出建议。

提前感谢您的帮助。

【问题讨论】:

    标签: hadoop hbase


    【解决方案1】:

    HBase 中的行键是任意字节数组,因此您可以随意制作它们。您可以调用Bytes.toBytes() 并将其传递给各种类型,以将rowkeys 转换为适合hbase 的字节数组。

    在 hbase 中没有像您想要的那样增加列名的本地方法。您需要一些外部数据源来维护计数,并且您的应用程序代码需要读取当前版本,并在 Get 请求中使用新列名写入。这可能是 hbase 中的一列,当您更新“h”“l”和“u”时会增加该列。编写新列不是问题,只要它在数百万个唯一列的数量级上。您可以考虑的另一种技术是在限定符中包含时间戳,这样它们就可以是唯一的,而无需额外读取以跟上版本更改。

    要确定最新的更改,您可以读取整行并自行处理,也可以使用过滤器,例如:ColumnPrefixFilter 来检索特定范围之间的数据。

    有一个项目OpenTSDB 使用按时间分组的行键的概念。它通常用于基础设施监控,但代码是开源的,因此您可以在那里找到一些有用的技术。

    【讨论】:

      【解决方案2】:

      您可能尚未完全吸收 HBase 的一个方面是它自动创建和维护一个 cell 的多个版本。 cell 是 HBase 中的 {row, column, version} 元组。

      HBase 默认保留同一个单元的三个版本 - 并且可以配置为存储任意数量的版本。最大数量在创建表时设置。另请参阅 HColumnDescriptor 信息

      HBase versioning info from the HBase book

      因此,您在选择行键时可能会有更大的灵活性。

      【讨论】:

      • 您好感谢您的快速回复。我已经检查了 HBase 版本控制,根据我的理解,假设我们将最大版本控制数设置为 10(假设每天对仪器的更新不会超过 10 次(这是我的关键,即 goog-20130101、goog-20130102、等)。但是我知道额外的版本将在一段时间后被删除。但我需要存储审计跟踪,所以我需要存储所有值并保留发生的任意数量的编辑/更新。这就是选择这样的原因rowkey (-date) 并继续为该日期的任何更新动态添加列。
      猜你喜欢
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 2015-09-08
      • 2016-02-18
      • 1970-01-01
      • 2014-02-06
      相关资源
      最近更新 更多