2016-08-17 13 views
2

私は数百万行(5.000.000程度)をフェッチするクエリを実行しています。コーディネーターがcom.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency ONE (1 responses were required but only 0 replica responded)例外を返すので、私のノードはかなり忙しいようです。 (私は実際にノードがビジーであるか、何か他のことが起こっているかどうかはわかりません)。Datastax Cassandra java driverページングを伴うステートメントのRetryPolicy

は、これまでのところ私はすべてのカサンドラノードに高いread_request_timeout_in_millisを設定しようとしたが、この

new SimpleStatement("SELECT * FROM where date = ? ",param1) 
    .setFetchSize(pageSize).setConsistencyLevel(ConsistencyLevel.ONE) 
    .setReadTimeoutMillis(ONE_DAY_IN_MILLIS); 
ResultSet resultSet = this.session.execute(statement); 

のようなクエリを実行するが、例外はまだスローされました。私の次の動きは、カスタムのRetryPolicyを試すことですが、誰かがreadTimeoutの再試行でクエリ全体が再実行されるか、失敗した現在のページから再試行するかどうかを教えてくれますか?

私はこのような何かをしようとしていた。

readReatriesは、私がデータをフェッチするattempますリトライ回数がある
@Override 
public RetryDecision onReadTimeout(Statement statement, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataRetrieved, int nbRetry) { 
    if (dataRetrieved) { 
     return RetryDecision.ignore(); 
    } else if (nbRetry < readRetries) { 
     LOGGER.info("Retry attemp {} out of {} ",nbRetry,readRetries); 
     return RetryDecision.retry(cl); 
    } else { 
     return RetryDecision.rethrow(); 
    } 
} 

+0

あなたのページサイズは? –

+0

@fuggy_yama私は100行のページサイズで作業しています。 – juliccr

答えて

3

クエリドライバでフェッチサイズを使用すると、クエリ全体が表示されることはありません。フェッチサイズを指定しない場合でも、ドライバはフェッチサイズとして5000を使用して、多くのオブジェクトでメモリを過負荷にしないようにします。何が起こっているのか、結果のチャンクは、制限付きクエリを発行することによって取得され、結果を反復する間に、チャンクドライバの終了時に結果の件数などのクエリが発行されます。結果番号がフェッチサイズより大きい場合は、ドライバからクラスタに複数のクエリが発行されます。ニースのシーケンス図と他の説明はofficial datastax driver pageにあります。

RetryPolicyは単一ステートメントで動作し、フェッチサイズについては何も知らないため、ステートメントは定義した回数だけリトライします(つまり、チャンクがタイムアウトで再試行されることを意味します)。

+0

ありがとう、Nenad Bozic!そのことを念頭に置いて、私はそれらの何百万という行をどのように移行するかを考えようとします。 – juliccr

+0

オープンソースのhttps://github.com/smartcat-labs/cassandra-migration-tool-javaを見ることができます。これはスキーマとデータの移行を扱っており、私たちは広範囲に渡って1か所から別の –

関連する問題