2017-07-04 54 views
0

當運行下面的CQL查詢:卡桑德拉SELECT DISTINCT和超時問題

SELECT DISTINCT partition_key FROM table_name; 

推測這是想回分區鍵是在使用給定表的列表。然而,隨着10秒的默認超時設置,它總是超時:

ReadTimeout: Error from server: code=1200 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - received only 0 responses." info={'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'} 

更改超時設置:

read_request_timeout_in_ms: 60000 
range_request_timeout_in_ms: 60000 
request_timeout_in_ms: 60000 

,然後運行在幾個卡桑德拉說,查詢結果節點崩潰,包括協調節點。該表具有大約> 100M行,並具有大約5000個唯一分區鍵。

是否有解決方法來查找唯一的分區鍵列表?

回答

1

這個查詢應該工作在假設你」卡桑德拉的現代版本(2.1及更高版本)的罰款重新使用支持分頁/讀取大小的客戶端,並使用足夠低的讀取大小(實際限制取決於服務器負載)。

使用第三方驅動程序,查找選項以刪除頁面/獲取大小。將其設置爲100,看看它是否表現更好。

使用cqlsh,如果你有卡珊德拉3.0或更高版本,嘗試PAGING 100;

+0

謝謝,在運行cqlsh中的查詢之前設置PAGING 100。 – Onst

1

沒有得到使用下列任一公用密鑰列表的另一種方式:

sstabledump -e 
    OR 
$ bin/sstablekeys <sstable_name> 

但是,你需要在所有節點的數據目錄運行它們,並手動篩選不同的密鑰。不直接但可行!

這裏是公用事業Cassandra SSTabledumpCassandra SSTablekeys

原因查詢超時是參考

  1. 無論在哪裏查詢子句
  2. 太多行通過> 100M
  3. 掃描協調員現在必須保持查詢處於打開狀態,直到獲得集羣中每個節點的響應,然後過濾出不同的結果。
  4. 不同的操作對於這個用例來說代價太高。
  5. 節點崩潰,因爲基本上他們填補堆與所選擇的全部行,並導致內存溢出(OOM錯誤)
+0

這似乎非常違反直覺。 Cassandra是爲大規模設計的,所以如果它不支持大規模的表格,他們爲什麼會添加這個功能呢? SELECT DISTINCT對於小表格工作正常,但是當開始縮放它時,我認爲這違背了Cassandra背後的哲學。如果我們有一個用戶表,並且開始擴展,那麼運行CQL查詢並獲取整個用戶列表並不容易嗎?當然必須有辦法。 – Onst

+0

@Onst Cassandra並不是爲了獲取所有東西。這是關於通過鍵查找。任何分佈式系統的事情是。您通過分區進行橫向擴展,在縮放時查詢所有內容變得越來越痛苦。 – dilsingi