2011-03-16 57 views
3

我有一個相當棘手的問題,請耐心等待,因爲我儘量不要在這裏絆倒我的話。我正在做一些研究,我的小組正在過渡到cassandra數據庫。我們的研究之前使用過MySQL,但數據超過了數據庫(16G內存中的192萬行 - 這是查詢數據足夠快的唯一方法)。數據本身就是靜態的。這裏有很多,但是在這一點上,任何新的數據都有點緩慢。即使在cassandra中劃分不均勻的遠程數據

該數據由一大堆分類器 - 分數對組成。我們爲數據庫制定了查詢,基本上說,「給我以下分類器的前500名」。然後數據庫返回許多分數。例如,如果我們要求獲得2個分類器的前500個分數,我們會得到1000行(每行包含分類器ID和分數 - 即[4,9100])。分數本身是不均勻的(分佈傾向於聚集到值的一端 - 順便說一下是從-10000到10000)

當我們過渡到cassandra時,有一些要求。首先,我們需要能夠在每個分類器的基礎上查詢最高和最低的N分數。通常情況下,我可以看到一個有序的分區器會適合這種情況,但正如我所說的那樣,分數趨向於在極端情況下聚集(這會給一個節點帶來太多的負擔)。所以我的第一個問題是,我如何平均分配分類器/得分對,同時仍然能夠查詢頂部或底部N.

有一個第二個要求,幾乎是第一個要求。有時候有必要找到附近的所有得分另一個得分。所以如果我看到分數爲6的分數爲6,我可能會問,向我展示500分最接近那個分數(全部在分類器6內)。我完全被這個問題困住了。我讀過cassandra支持二級索引(耶),但只有散列類型(噓 - 沒有範圍)。我們是否爲這個用例創建了一個獨立的ColumnFamily?

最後,速度是至關重要的。數據正用於交互式GUI應用程序中。理想情況下,查詢應該只需要幾秒鐘。如果數據全部卡在一個特定的節點上,它會減慢速度。

我們嘗試了各種巧妙的技巧。我們最好的想法是將數據放入桶中,以便前500名進入第1桶,下一個500進入第2桶,等等。優點是獲得我們剛剛要求的第一個500的頂部500.同樣,所有數據都將使用隨機分區器均勻分佈。然而,由於我們的查詢MOST只對第1桶感興趣,它會給一個節點帶來很大負擔(請記住,如果涉及N個分類器,實際上它是每個桶500 * N個分數)。這個方案的真正缺點是,當我們需要根據分數的近似值進行查詢時(我們必須對桶進行某種奇怪的二進制搜索以找到我們的起始值),它纔會崩潰。

在這一點上,我們的想法很少。我見過的關於卡桑德拉的一切都讓我懷疑它是否適合這個任務。我們選擇它主要是因爲它的橫向可伸縮性,這很重要(添加節點比分割RDBM要容易得多)。所以我想我的總體問題是:你會如何處理這個問題?如果cassandra,請解決任何上述問題。否則,任何洞察力或智慧將不勝感激。謝謝。

回答

3

爲什麼不將分類器存儲爲列族行鍵和列名中的分數。由於列是排序的,因此查詢給定分類器的頂部/底部500列非常快。第二種類型的查詢也有可能,當您正在尋找附近S上的分數例如你可以選擇以前小號和500列500列之後小號然後篩選附近小號 500列。

+0

如果我錯了,糾正我,但你是否建議將給定分類器的所有分數存儲在一行下?我想(或許不正確)cassandra對它可以容納的列數有限制。現在每個分類器將有大約200萬分與它相關聯。 200萬的分數,每一個都代表自己的專欄,仍然會快速查找? – 2011-03-16 22:38:30

+2

從版本0.7開始,每行最多可以存儲20億列。我做了一些測試,閱讀表現很好。那麼它對我的需求很好,而且只有大約100000列。 – Jcs 2011-03-16 23:13:22

+0

嗯,我必須嘗試一下!非常感謝你的洞察力,非常感謝。 – 2011-03-16 23:21:28