2015-06-17 24 views
2

我对cassandra有点新鲜。 我创建了一个如下表格 创建表格事件(日期文本,小时文本,sip文本,dip文本,计数,计数器, 主键((日,小时),sip,dip));如何避免在cassandra集群键列上排序

我们的用例是,应用程序每秒收到很多事件。我们希望每天每小时都有一个分区分区,如果再次收到相同的事件,我们需要更新计数器。并且我们还希望为dip和sip列组合使用独特的条目,因此我将它们作为主键的一部分。

在此处,sip列正在形成一个集群键,在将记录插入表中时发生排序。在我们的案例中,这些列不需要排序,排序是一个开销,而我们在表中包含数百万行。如何避免这种排序开销,任何人都可以帮助我吗?

+2

排序在这种情况下可能不是开销。要更新计数器,您必须执行如下操作:'UPDATE events SET count = count + 1 WHERE day = in_day and hour = in_hour and sip = in_sip and dip = in_dip;' Cassandra需要将记录分类以便快速到达这一行。 –

回答

1

Cassandra需要通过群集列进行排序才能正常运行。它需要以这种方式存储数据,以保持行密钥的独特性并支持诸如聚类列上的范围查询之类的事情。正如Arun所说,这可以让您的后续更新快速运行。

您可以通过按排序顺序插入行来减少排序次数,例如通过将第一个群集列作为时间戳记。但是你会失去增加计数器的好处,因为你不知道早先事件的时间戳键。要获得最终计数,您需要在每个小时后执行汇总操作以汇总匹配事件。

另一种方法是将sip和/或dip部分分区键。然后每个事件都会散列到不同的分区存储桶中,不需要进行排序。但是,你会把事件组合分成一小时分区。这可能是好的或坏的取决于你的需求。如果事件发生率很高,将它们全部分组到相同的一小时分区中可能会产生热点,因为所有事件都会散列到同一节点,因此使事件分开分区将分散写入负载。如果稍后将事件作为一小时块读取对您来说更为重要,那么将它们分组到一个分区将会使得读取它们更高效,但是由于排序而导致更昂贵的写入。

所以一般来说,如果你保持分区的合理大小,排序开销不应该太大,因为它是在内存中完成的。如果您的分区太大以至于导致性能问题,请通过向分区键添加另一个字段以将分区拆分为更小的块来减小它们的大小,以将负载分散到更多节点上。