2015-06-17 63 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部分分區鍵。然後每個事件都會散列到不同的分區存儲桶中,不需要進行排序。但是,你會把事件組合分成一小時分區。這可能是好的或壞的取決於你的需求。如果事件發生率很高,將它們全部分組到相同的一小時分區中可能會產生熱點,因爲所有事件都會散列到同一節點,因此使事件分開分區將分散寫入負載。如果稍後將事件作爲一小時塊讀取對您來說更爲重要,那麼將它們分組到一個分區將會使得讀取它們更高效,但是由於排序而導致更昂貴的寫入。

所以一般來說,如果你保持分區的合理大小,排序開銷不應該太大,因爲它是在內存中完成的。如果您的分區太大以至於導致性能問題,請通過向分區鍵添加另一個字段以將分區拆分爲更小的塊來減小它們的大小,以將負載分散到更多節點上。