【问题标题】:Hbase row key filters, range scan and cassandra abilities over thisHbase 行键过滤器、范围扫描和 cassandra 能力
【发布时间】:2014-02-04 21:43:36
【问题描述】:

在 Hbase 中,我使用“app_name_ip_timestamp”之类的行键加载数据。但是会有很多这样的应用。所以本质上我每分钟收集大约 5 万个数据点。

如果我必须基于 ip 进行查询,我可以在行键上使用子字符串过滤器,但这是一个好方法吗? 无论如何,Cassandra 可以提供帮助吗? Cassandra 在这种情况下有什么优势? 如何使 HBase 适合我可以使用行键 subString 过滤器并执行范围扫描并在毫秒内检索结果的情况? 在即席查询和部分行键、范围扫描、聚合结果方面查询 cassandra 和 hbase 的主要区别是什么

【问题讨论】:

    标签: hadoop nosql cassandra hbase


    【解决方案1】:

    我不能谈论 Cassandra,所以我将回答您的问题考虑到 HBase,因为此类问题已在此处多次提出。您基本上需要一个二级索引,HBase 不直接支持,请阅读以下文档:http://hbase.apache.org/book/secondary.indexes.html

    现在,根据您的访问模式,我建议您手动对数据表和作为二级索引的表进行双重写入,其中包含 2 种不同类型的行键;

    [ip_as_long]-1-[timestamp]-[appname]
    [ip_as_long]-2-[appname]-[timestamp]
    

    此表将只有一个族,其中一列由数据表中数据点的行键组成。使用良好的缓冲区,您根本不会遇到任何性能损失。

    要根据ip查询数据,只需扫描索引表,设置起始行为“[ip_as_long]-1-”按时间戳查询,或“[ip_as_long]-2-[appname]”按时间戳查询应用名称。该扫描将为您提供行键,您可以使用这些行键对数据表执行多重获取以检索它。

    考虑到这种方法,您可以拥有另一个以 appname 作为主维度的二级索引表,这样您也可以通过“[appname]-[timestamp]”查询数据。

    建议:如果你有足够的存储空间,我会自己写整个数据而不是写rowkey,这样你就可以避免执行multiget。

    【讨论】:

    • 如果我维护两个表,其中不同形式的相同行键映射到一个 uid 和另一个表,其中 uid_timestamp 存储键值对,那么我的表现会是什么?
    • 如果您执行返回几行的查询会非常好(因为在从索引读取后获取数据需要额外的 multiget)。将数据表的行键存储在索引表中对于对其进行大型扫描来说效果不佳。如果您需要对索引表进行大扫描,请坚持我提到的更快的建议:将所有数据存储在索引表中而不是 rowkey 中,您将有数据重复(将相同的列存储在两个表),但您不应该害怕,这是您使用 HBase 时常用的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2013-09-12
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多