Cassandra还是Hbase?

时间:2013-02-19 05:38:39

标签: cassandra hbase

我有一个要求,我想存储以下内容:

  • Mac地址// PKEY
  • TimeStamp // PKEY
  • LocationID
  • OWNERNAME
  • 信号强度

插入逻辑如下:

  • 每个位置(LocationID)
  • 每小时存储一次活动设备(MacAddress)的上述统计信息
  • 条目是在每小时结束时创建的,因此主键始终为MAC + TimeStamp

没有更新,只有插入

可以执行的查询如下:

  • 向我提供最后'N'小时的所有条目,其中MacAddress =“....”
  • 给我最后'N'小时的所有条目其中LocationID IN(locID1,locID2,..);

毋庸置疑,有数十亿条目,我想使用HBASE或Cassandra。我试图探索,似乎Cassandra可能不是正确的选择。

原因是我在cassandra中有以下内容:

< < RowKey> MacAddress:TimeStamp> >
+ LocationID
+所有者名称 +信号强度

两个查询都会扫描整个数据库,对吧?即使我在LocationID上添加索引,这只会在某种程度上帮助第二个查询,因为时间戳上没有索引(我相信时间戳上的搜索速度不快,因为MacAddress:TimeStamp复合键不会允许我们只搜索时间戳,相反,会发生全扫描,这是正确的吗?)。

如果我们选择HBase或Cassandra,我会在这里遇到很大的时间,任何见解都会有所帮助。

3 个答案:

答案 0 :(得分:5)

使用Cassandra对此进行建模的正确方法是使用由mac地址分区的表,按时间戳排序,并在位置ID上编制索引。请参阅Cassandra数据模型文档,尤其是section on clustering [预定义排序]。您的所有查询都不需要全表扫描。

答案 1 :(得分:1)

你必须记住,像Cassandra这样的NoSql实例允许水平扩展,并且可以更容易地对数据进行分片。通过开发分片策略(识别分片键等),您可以显着减少单个实例上的数据大小,并使查询(即使在尝试查询海量数据集时)也可行。

答案 2 :(得分:0)

任何一个都可以用于此查询:

  

给我最后一个条目N'小时MacAddress =" ...."

在cassandra中,您可能希望使用有序的分区程序,以便轻松扫描。这样你就不必扫描整个表了。 (我在Cassandra身上有点生气)。

在hbase中,它始终由rowkey排序,因此扫描变得简单。您只需设置一个开始和停止rowkey。从概念上讲,它将是:

  scan.setStartRow(mac+":"+timestamp);
  scan.setStopRow(mac+":"+endtimestamp);

然后它只扫描给定时间段内给定mac地址的行 - 只有一小部分数据。

这个查询要困难得多:

  

给我最后一个条目N'小时位置ID IN   (locID1,locID2,..);

Cassandra确实有二级索引,所以看起来很容易"容易"但我不知道它会扫描多少数据。我没有看过Cassandra,因为它增加了二级索引。

在hbase中,您必须扫描整个表格或创建第二个表格。我建议创建第二个表,其中rowkey将是< location:timestamp>并且你复制了数据。然后,您可以使用该表按位置查找数据,并使用扫描并设置开始和结束键。