web-dev-qa-db-ja.com

cassandraのcqlshコンソールでの操作タイムアウトエラー

3つのノードCassandra Clusterがあり、2,000,000行を超えるテーブルを1つ作成しました。

Cqlshでこの(select count(*) from userdetails)クエリを実行すると、次のエラーが発生しました。

OperationTimedOut:エラー= {}、last_Host = 192.168.1.2

より少ない行または制限50,000でカウント関数を実行すると、正常に動作します。

14
Kaushal

count(*)は実際にはすべてのデータをページ送りします。したがって、制限のないselect count(*) from userdetailsは、その数の行でタイムアウトすることが予想されます。ここにいくつかの詳細: http://planetcassandra.org/blog/counting-key-in-cassandra/

自分でカウントを維持するか、Sparkを使用するか、または球場番号だけが必要な場合はJMXから取得することを検討してください。

JMXから取得するには、データモデルによっては少しトリッキーになる場合があります。パーティションの数を取得するには、org.Apache.cassandra.metrics:type=ColumnFamily,keyspace={{Keyspace}},scope={{Table​}},name=EstimatedColumnCountHistogram mbeanを取得し、90個の値をすべて合計します(これがnodetool cfstatsの出力です)。これは、sstableに存在する数のみを提供するため、より正確にするために、フラッシュを実行するか、MemtableColumnsCount mbeanからmemtablesの数を見積もることができます

非常に基本的な球場番号の場合、リストされているすべての範囲にわたってsystem.size_estimatesから推定パーティション数を取得できます(これは1つのノードの番号にすぎないことに注意してください)。それをノード数で乗算し、次にRFで除算します。

14
Chris Lohfink

Cqlshコマンドでタイムアウトを増やすこともできます。例:

cqlsh --request-timeout 120 myhost
9

Apache Cassandraでクライアントのタイムアウト制限を変更するには、2つの手法があります。

手法1:cqlshrcファイルを変更します。

手法2:プログラムcqlshを開き、client_timeout変数を使用して指定された時間を変更します。

達成するための詳細については、リンクを参照してください: https://playwithcassandra.wordpress.com/2015/11/05/cqlsh-increase-timeout-limit/

4
Sashank Bhogu

レコード数を取得するためにCassandra 3.4およびcqlshを使用しています。3.4でコードが変更されたようです。cqlshは単にcqlsh.pyを呼び出します。cqlsh.pyの内部には_DEFAULT_REQUEST_TIMEOUT_SECONDS_変数のデフォルトは10(秒)ですが、これを3600(1時間)に変更すると、SELECT count(*)クエリが機能します。

2
Kyle Burke

cqlshを使用する場合:エディターでスクリプトを開き、「timeout」という単語をすべて見つけます。デフォルト値を10から60に変更し、スクリプトを保存します。

2
Oleg Belous

レコード数を取得するためにCassandra 3.11およびcqlshを使用しています。私のテーブルは約40,000,000行であり、この問題を強制されました。私の問題は2つの変更で解決しました:

まず、すべてのノードの「cassandra.yaml」にあるすべてのタイムアウト設定を変更します。

# 3,600,000 is one hour in ms
read_request_timeout_in_ms: 3600000
range_request_timeout_in_ms: 3600000
write_request_timeout_in_ms: 3600000
counter_write_request_timeout_in_ms: 3600000
cas_contention_timeout_in_ms: 3600000
truncate_request_timeout_in_ms: 3600000
request_timeout_in_ms: 3600000
slow_query_log_timeout_in_ms: 3600000

次に、すべてのノードでcassandraを再起動します。

そして2番目は以下のようにタイムアウトを指定して「cqlsh」を実行しています:

cqlsh --request-timeout=3600000 <myhost>
0

1日のカウントを行うと上記と同じ問題が発生しますが、回避策として、カウントを以下のような2つのリクエスト(12時間+ 12時間)に分割します。

cqlsh:jw_schema1> select count(*) from flight_statistics where insert_time >= '2015-08-20 00:00:00' and insert_time <= '2015-08-20 11:59:59' ALLOW FILTERING;

 count
-------
 42528

(1 rows)
cqlsh:jw_schema1> select count(*) from flight_statistics where insert_time >= '2015-08-20 12:00:00' and insert_time <= '2015-08-20 23:59:59' ALLOW FILTERING;

 count
-------
 86580

(1 rows)
cqlsh:jw_schema1> 
0
Jasonw