PlayORM中的基本分区

时间:2013-03-21 13:51:34

标签: playorm

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

  • 时间戳
  • 设备ID
  • 设备名称
  • 设备所有者

PKEY(TimeStamp,Device ID):这意味着在TimeStamp上发生了分区。

以下是我感兴趣的查询:

从架构中选择*,其中TimeStamp ='..' 从架构中选择*,其中DeviceID ='..'

第一个查询返回500K记录,第二个查询返回50K记录。对于第一个查询,瓶颈是在单个节点上获取,因此我想在TimeStamp的多个节点上分发数据。第二个查询的瓶颈是所有记录可能分布在不同节点上的所有磁盘上,导致多次磁盘提取。

现在假设我想创建虚拟分区,以便特定TimeStamp的条目也分布在群集节点上。这可以在PlayORM中使用吗?如果是的话,你能否提供可以这样做的代码(或者这样做的例子)?

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

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

1 个答案:

答案 0 :(得分: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显示了它们的使用方法。我将要求某人根据您的反馈调整文档,将链接直接放入代码库中的代码......

PS。如果你从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')从TABLE中选择d作为d,其中d.time> Integer.MIN_INT

然后结果以该索引的顺序返回(即本例中的时间),或者如果你想要反向顺序,只需调用cursor.afterLast然后调用cursor.previous,cursor.previous等。

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

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

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

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