2017-07-04 7 views
0

を選択:カサンドラは、DISTINCTとタイムアウト問題

SELECT DISTINCT partition_key FROM table_name; 

これはおそらく特定のテーブルのために使用されているパーティション・キーのリストを返すためのものです。しかし、10Sのデフォルトのタイムアウト設定と、それは常にタイムアウト:

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

ありがとうございます。クエリを実行する前にPAGING 100を設定して、cqlshで作業しました。 – Onst

1

は、次のユーティリティのいずれかを使用してキーのリストを取得する別の方法があります:

sstabledump -e 
    OR 
$ bin/sstablekeys <sstable_name> 

しかし、あなたは、すべてのノードのデータディレクトリ全体でそれらを実行し、手動で個別のキーをフィルタリングする必要があります。単純ではないが実行可能!ここで

は、クエリのタイムアウトの理由は> 100M

  • をスキャンするクエリ内の句
  • あまりにも多くの行

    1. NoのユーティリティCassandra SSTabledumpCassandra SSTablekeys

      のリファレンスですコーディネータは、クラスタ内のすべてのノードからの応答を取得してから、別のものをフィルタリングするまでクエリを開いたままにしておく必要があります。

    2. 別個の操作は、この用途のために単純に高価すぎる。
    3. ノードがクラッシュし、本質的に、彼らは行全体が選択された状態で、ヒープを埋めると(OOMエラーを)OutOfMemoryを起こすので
  • +0

    を試してみてください。 Cassandraは大規模に設計されているため、大規模なテーブルをサポートしていないと、なぜこの機能を追加するのですか? SELECT DISTINCTは小さいテーブルでうまく動作しますが、スケールが崩れ始めると破損しますが、これはCassandraの背後にある哲学に反していると思います。ユーザのテーブルがあり、それが拡大し始めると、CQLクエリを実行してユーザリスト全体を取得する簡単な方法はありませんか?確かに道があるはずです。 – Onst

    +0

    @Onst Cassandraはすべてを取得するものではありません。それはキーによるルックアップです。その問題の分散システムはどれも。パーティショニングによって水平方向にスケールし、拡大するにつれてすべてを照会するのはますます苦になります。 – dilsingi