0

假设我在 cassandra 中有一个具有以下模式的 CF:

  • 时间戳
  • 设备编号
  • 设备名称
  • 设备所有者

PKEY (TimeStamp, Device ID):这意味着分区正在发生在时间戳上。

以下是我感兴趣的查询:

Select * from schema where TimeStamp='..' Select * from schema where DeviceID='..'

第一个查询返回 500K 记录,第二个查询返回 50K 记录。对于第一个查询,瓶颈都是在单个节点上获取,所以我想将数据分布在多个节点上以获得时间戳。第二次查询的瓶颈是所有记录可能分布在不同节点的磁盘上,导致多次磁盘获取。

现在假设我想创建虚拟分区,这样特定时间戳的条目也分布在集群节点上。这在 PlayORM 中可行吗?如果是,您能否提供可以这样做的代码(或这样做的示例)?

我的另一个要求是搜索特定设备 ID 的所有记录。我可以对同一个 CF 的“设备 ID”进行虚拟分区吗?如果是,您能否提供代码/链接来说明如何操作?

如果有人能提供做这样的事情的源代码,我会很高兴,因为文档不是那么容易理解,而且仅仅通过阅读当前文档来编写代码就是一场噩梦。如果没有“完整”的代码示例,评估 PlayORM 似乎是不可能的。

4

1 回答 1

3

是的,您在 PlayOrm 中需要这样的东西......(如果我遗漏任何内容,请发表评论,我可以再次回复)。

https://github.com/deanhiller/playorm/blob/master/src/test/java/com/alvazan/test/db/PartitionedTrade.java

还有查询 PARTITIONS t('account', :partId) SELECT t FROM TABLE as t INNER JOIN t.security as s WHERE s.securityType = :type and t.numShares = :shares"

'account' 标识分区列, :partId 是分区的 id。在您的情况下,您将有 PARTITIONS t('deviceid', {actualDeviceId}) 或 t('time', {time}) 其中第一个参数是列名,第二个是分区的实际 id 时间或设备分区的 ID。实现分区的行数不应超过 X 百万行,其中 X 可能约为 300 万行。

com.alvazan.test.db 包有大量不同的示例,com.alvazan.test 显示了它们的使用方式。我将要求某人根据您的反馈调整文档,以将链接直接链接到我们代码库中的代码......

附言。如果您从 github 下载,运行 gradlew eclipse 或 gradle eclipse(取决于操作系统),然后导入到 eclipse 中,所有测试都可以使用内存中的 noSQL 版本进行开箱即用(我们将其用于开发)。然后,如果您想针对 cassandra 运行,则在文档中它有如何更改一行并且所有测试都针对 cassandra 运行。

加速。PlayOrm 使用复合名称模式为每个分区(每个分区的索引)执行宽行。当您查询时,它以 200 个批次(或您提供的大小)读取这一行,然后使用索引中找到的键向所有机器发送请求(即此时您获得并行吞吐量)。这是因为每个分区都分布在集群中。事实上,所有节点最终都会得到几乎所有分区的切片,具体取决于您拥有多少节点和多少分区(即 100 个节点和 32 个分区,并非所有节点都具有所有分区)。

在幕后,playorm 正在做一些非常非常简单的事情。所有行都被写入,就好像它们根本没有分区一样!!!然后写入索引行(RF=3 表示到 3 个节点),索引行名称为 /TABLE/partition/column/partitionId。那是索引的行键。使用命令行工具,您甚至可以自己读取索引,只读取索引或查询分区。为此,请使用 playOrm 的命令行工具。

最后,由于 cassandra 中的宽行是有序的,因此当您使用特定索引(例如 PARTITIONS d('deviceid', 'device1') select d from TABLE as d where d.time > Integer.MIN_INT

然后结果按该索引的顺序返回(即在这种情况下为时间),或者如果您想要相反的顺序,只需调用 cursor.afterLast 然后 cursor.previous、cursor.previous 等等等。

需要明确的是,PlayOrm 在这里故意忽略了 cassandra 分区。它写入您的数据,就像根本没有分区一样。它还写入一个或两个索引。假设您分区两次,一次按时间,一次按设备 ID。在这种情况下,它使用行键(并说您的实体称为设备)写入 StringIndice 或 IntegerIndice 表(BigInteger !!!不是 Integer)。假设在您的实体中,您在“名称”列上有 @NoSqlIndexed!!!!

/Devices/byDevice/device1/name = the wide row
/Devices/byTime/time56/name = the wide row

如果您有更多 @NoSqlIndexed 列,则索引表中有更多行。然而,所有行都分布在集群中,并且不关心分区。

这有意义吗?随意尝试一下。如果您对实现它有任何问题/疑问,只需在 stackoverflow 上发布一个新问题。

于 2013-03-21T15:27:26.593 回答