2

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

  • Mac 地址 // PKEY
  • 时间戳 // PKEY
  • 位置 ID
  • 所有者名称
  • 信号强度

插入逻辑如下:

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

没有更新,只有插入

可以执行的查询如下:

  • 给我最后 'N' 小时的所有条目,其中 MacAddress = "...."
  • 给我最近'N'小时的所有条目 Where LocationID IN (locID1, locID2, ..);

不用说,有数十亿个条目,我想使用 HBASE 或 Cassandra。我尝试过探索,似乎Cassandra可能不是正确的选择。

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

< < RowKey > MacAddress:TimeStamp > >
+ LocationID
+ OwnerName
+ 信号强度

这两个查询都会扫描整个数据库,对吧?即使我在 LocationID 上添加一个索引,这也只会在一定程度上有助于第二次查询,因为时间戳上没有索引(我相信时间戳上的搜索并不快,因为 MacAddress:TimeStamp 复合键不会允许我们仅搜索时间戳,而是进行完整扫描,对吗?)。

我被困在这里很长时间了,如果我们应该选择 HBase 或 Cassandra,任何见解都会有帮助。

4

3 回答 3

5

使用 Cassandra 进行建模的正确方法是使用按 MAC 地址分区、按时间戳排序并按位置 ID 编制索引的表。请参阅 Cassandra 数据模型文档,尤其是关于集群[预定义排序] 的部分。您的任何查询都不需要全表扫描。

于 2013-02-24T05:27:56.000 回答
1

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

于 2013-02-21T04:14:49.877 回答
0

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

给我最后 'N' 小时的所有条目,其中 MacAddress = "...."

在 cassandra 中,您可能希望使用有序分区器,以便进行简单的扫描。这样您就不必扫描整个表。(我对 Cassandra 有点生疏)。

在 hbase 中,它总是按行键排序,因此扫描变得容易。您只需设置一个开始和停止行键。从概念上讲,它将是:

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

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

这个查询要困难得多:

给我最近'N'小时的所有条目 Where LocationID IN (locID1, locID2, ..);

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

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

于 2013-05-10T17:38:48.547 回答