web-dev-qa-db-ja.com

select count(*)はCassandraでタイムアウトの問題に遭遇します

ばかげた質問かもしれませんが、Cassandraのテーブルのサイズを判断することはできません。

これは私が試したものです:

select count(*) from articles;

テーブルが小さい場合は正常に動作しますが、テーブルがいっぱいになると、常にタイムアウトの問題が発生します。

cqlsh:

  • OperationTimedOut:errors = {}、last_Host = 127.0.0.1

DBeaver:

  • 実行1:225,000(7477ミリ秒)
  • 実行2:233,637(8265ミリ秒)
  • 実行3:216,595(7269ミリ秒)

私はそれがいくつかのタイムアウトに達し、単に中止すると仮定します。テーブル内のエントリの実際の数は、おそらくはるかに多いでしょう。

ローカルCassandra=完全にアイドル状態のインスタンスに対してテストしています。全テーブルスキャンを実行する必要があり、その間応答しない場合は気にしません。

Cassandra table?のエントリ数を確実にカウントする方法はありますか?

私はCassandra 2.1.13を使用しています。

16
Philipp Claßen

cqlsh:OperationTimedOut:errors = {}、last_Host = 127.0.0.1のタイムアウトに関連する問題を見る限り

オプションを使用して単純に増やすことができます:

 --connect-timeout=CONNECT_TIMEOUT
                       Specify the connection timeout in seconds (default: 5
                       seconds).
 --request-timeout=REQUEST_TIMEOUT
                       Specify the default request timeout in seconds
                       (default: 10 seconds).
14

私の現在の回避策は次のとおりです。

COPY articles TO '/dev/null';
...
3568068 rows exported to 1 files in 2 minutes and 16.606 seconds.

背景:Cassandraは テーブルをテキストファイルにエクスポートする をサポートします。たとえば:

COPY articles TO '/tmp/data.csv';
Output: 3568068 rows exported to 1 files in 2 minutes and 25.559 seconds

これは、生成されたファイルの行数とも一致します。

$ wc -l /tmp/data.csv
3568068
12
Philipp Claßen

Cassandraテーブルのエントリ数を確実にカウントする方法はありますか?

わかりやすい答えはnoです。これはCassandraの制限ではありませんが、一意のアイテムを確実にカウントするための分散システムの難しい課題です。

これは、HyperLogLogのような近似アルゴリズムが取り組む課題です。

可能な解決策の1つは、counter in Cassandra=を使用して個別の行の数をカウントすることですが、counters '%エラーが発生します。

9
doanduyhai

これは、Cassandraで大きなCOUNT(*)を実行するときに発生するタイムアウトの問題を回避する行をカウントするための優れたユーティリティです。

https://github.com/brianmhess/cassandra-count

3
Kat

理由は簡単です:

使用している場合:

SELECT count(*) FROM articles;

データベースには次のような効果があります。

SELECT * FROM articles;

すべてのノードに対してクエリを実行する必要があります。 Cassandra=は単にタイムアウトになります。

タイムアウトを変更できますが、それは良い解決策ではありません。 (一度は問題ありませんが、通常のクエリでは使用しないでください。)

より良い解決策があります。クライアントに行をカウントさせることです。行を挿入するときに行を数えるJavaアプリを作成し、Cassandra=テーブルのカウンター列を使用して結果を挿入できます。

0
Citrullin

コピーを使用して、cassandraタイムアウトが通常count(*)で発生するのを避けることができます

このバッシュを使う

cqlsh -e "copy keyspace.table_name (first_partition_key_name) to '/dev/null'" | sed -n 5p | sed 's/ .*//'

0
Shubham

Cassandra nodetool:

nodetool tablestats <keyspaceName>.<tableName>

応答してください:

キーの数(推定):カウント

0
darky