Javaクライアントをバッチで(INSERT)レコードをCassandraクラスターにプッシュします。バッチ内の要素はすべて同じ行キーを持っているため、すべてまた、トランザクションがアトミックである必要はないため、ログに記録されていないバッチを使用しています。
各バッチ内のINSERTコマンドの数はさまざまな要因に依存しますが、5〜50000の間であれば何でもかまいません。最初に、1つのバッチにあるだけのコマンドを入れて送信します。これはcom.datastax.driver.core.exceptions.InvalidQueryException: Batch too large
。その後、バッチごとに1000個のINSERTの上限を使用し、次に300個まで使用しました。この制限がどこから来たのかを正確に知らずにランダムに推測していることに気付きました。
私の質問は、この制限は何ですか?変更できますか?バッチに配置できる要素の数を知るにはどうすればよいですか?バッチが「いっぱい」になったとき
上限を増やすのではなく、複数のリクエストに分割することをお勧めします。すべてを1つの巨大なリクエストに入れると、コーディネーターに大きな悪影響を及ぼします。すべてを1つのパーティションに入れることで、遅延を減らすことで一部のサイズのバッチのスループットを改善できますが、バッチを使用してパフォーマンスを向上させることはできません。したがって、異なるバッチサイズを使用して最大スループットを取得するように最適化しようとすると、ユースケース/スキーマ/ノードに大きく依存し、一般的にサイズが低下し始めるサイズに崖があるため、特定のテストが必要になります。
あります
# Fail any batch exceeding this value. 50kb (10x warn threshold) by default.
batch_size_fail_threshold_in_kb: 50
cassandra.yaml
を増やしますが、スループットを損なわずに実際に助けていることを確認するために必ずテストしてください。
Cassandraログを見ると、次のようなものを見つけることができます。
エラー19:54:13 [matches]のバッチのサイズは103.072KiBで、指定されたしきい値50.000KiBを53.072KiB超えています。 (batch_size_fail_threshold_in_kbを参照)
CHUNKSIZEを低い値に変更することでこの問題を修正しました(例1) https://docs.datastax.com/en/cql/3.1/cql/cql_reference/copy_r.html
CHUNKSIZE = 1で「mybackup」からmytableをコピーします。
操作ははるかに遅くなりますが、少なくとも現在は動作しています