2016-07-25 7 views
0

私はを使用しています[cqlsh 5.0.1 |カサンドラ2.2.1 | CQL仕様3.3.0 |ネイティブプロトコルv4]バージョン。これは鍵空間definationあるカサンドラセカンダリインデックスのクエリ:ReadTimeout:code = 1200

[IをXと番号を交換した2。

$ nodetool status test_keyspace 
Datacenter: datacenter1 
======================= 
Status=Up/Down 
|/ State=Normal/Leaving/Joining/Moving 
-- Address  Load  Tokens  Owns (effective) Host ID       Rack 
UN 10.xxx.4.xxx 85.32 GB 256   100.0%   xxxx-xx-xx-xx-xx    rack1 
UN 10.xxx.4.xxx 80.99 GB 256   100.0%   x-xx-xx-xx-xx     rack1 

として複製因子との2ノードCassandraのクラスタを有します。

cqlsh> describe test_keyspace; 

CREATE KEYSPACE test_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '2'} AND durable_writes = true; 

CREATE TABLE test_keyspace.test_table (
    id text PRIMARY KEY, 
    listids map<int, timestamp> 
) WITH bloom_filter_fp_chance = 0.01 
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}' 
    AND comment = '' 
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'} 
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
    AND dclocal_read_repair_chance = 0.1 
    AND default_time_to_live = 0 
    AND gc_grace_seconds = 864000 
    AND max_index_interval = 2048 
    AND memtable_flush_period_in_ms = 0 
    AND min_index_interval = 128 
    AND read_repair_chance = 0.0 
    AND speculative_retry = '99.0PERCENTILE'; 
CREATE INDEX list_index ON test_keyspace.test_table (keys(listids)); 

idはユニークであり、listids'sキーは、私はこの鍵空間で何百万ものレコードを持っている1000に近いカーディナリティを持っています。

特定のキーとそのレコードのリストを持つレコードの数を取得したいと思います。私はcqlshからこのクエリを試してみました:

select count(1) from test_table where listids contains key 12; 

は、数秒後に、このエラーを得た:

ReadTimeout: 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'} 

を私はすでにcqlshrcとcassandra.yamlでタイムアウトパラメータを変更しています。私は/var/log/cassandra/system.logをチェックすると

cat /etc/cassandra/conf/cassandra.yaml | grep read_request_timeout_in_ms 
#read_request_timeout_in_ms: 5000 
read_request_timeout_in_ms: 300000 

cat ~/.cassandra/cqlshrc 
[connection] 
timeout = 36000 
request_timeout = 36000 
client_timeout = 36000 

は、私が得た唯一this-

WARN [SharedPool-Worker-157] 2016-07-25 11:56:22,010 SelectStatement.java:253 - Aggregation query used without partition key 

私は私のコードを生成するJavaクライアントを使用しています。 Javaクライアントはまた、多くの読み取りタイムアウトを取得しています。 1つの解決策は私のデータを改造するかもしれないが、それはもっと時間がかかるだろう(私はそれについてはわからないが)。誰かがこの問題の迅速な解決策を提案できますか?

統計を追加:

$ nodetool cfstats test_keyspace 
Keyspace: test_keyspace 
    Read Count: 5928987886 
    Read Latency: 3.468279416568199 ms. 
    Write Count: 1590771056 
    Write Latency: 0.02020026287239664 ms. 
    Pending Flushes: 0 
     Table (index): test_table.list_index 
     SSTable count: 9 
     Space used (live): 9664953448 
     Space used (total): 9664953448 
     Space used by snapshots (total): 4749 
     Off heap memory used (total): 1417400 
     SSTable Compression Ratio: 0.822577888909709 
     Number of keys (estimate): 108 
     Memtable cell count: 672265 
     Memtable data size: 30854168 
     Memtable off heap memory used: 0 
     Memtable switch count: 0 
     Local read count: 1718274 
     Local read latency: 63.356 ms 
     Local write count: 1031719451 
     Local write latency: 0.015 ms 
     Pending flushes: 0 
     Bloom filter false positives: 369 
     Bloom filter false ratio: 0.00060 
     Bloom filter space used: 592 
     Bloom filter off heap memory used: 520 
     Index summary off heap memory used: 144 
     Compression metadata off heap memory used: 1416736 
     Compacted partition minimum bytes: 73 
     Compacted partition maximum bytes: 2874382626 
     Compacted partition mean bytes: 36905317 
     Average live cells per slice (last five minutes): 5389.0 
     Maximum live cells per slice (last five minutes): 51012 
     Average tombstones per slice (last five minutes): 2.0 
     Maximum tombstones per slice (last five minutes): 2759 

     Table: test_table 
     SSTable count: 559 
     Space used (live): 62368820540 
     Space used (total): 62368820540 
     Space used by snapshots (total): 4794 
     Off heap memory used (total): 817427277 
     SSTable Compression Ratio: 0.4856571513639344 
     Number of keys (estimate): 96692796 
     Memtable cell count: 2587248 
     Memtable data size: 27398085 
     Memtable off heap memory used: 0 
     Memtable switch count: 558 
     Local read count: 5927272991 
     Local read latency: 3.788 ms 
     Local write count: 559051606 
     Local write latency: 0.037 ms 
     Pending flushes: 0 
     Bloom filter false positives: 4905594 
     Bloom filter false ratio: 0.00023 
     Bloom filter space used: 612245816 
     Bloom filter off heap memory used: 612241344 
     Index summary off heap memory used: 196239565 
     Compression metadata off heap memory used: 8946368 
     Compacted partition minimum bytes: 43 
     Compacted partition maximum bytes: 1916 
     Compacted partition mean bytes: 173 
     Average live cells per slice (last five minutes): 1.0 
     Maximum live cells per slice (last five minutes): 1 
     Average tombstones per slice (last five minutes): 1.0 
     Maximum tombstones per slice (last five minutes): 1 
+0

私は同じ問題に直面しました。試みました1)#無効にするには、Noneに設定することもできます。client_timeout = home .cassandraのcqlshrcにはありません。助けなかった2)ym.cassandra.yamlのtimeout_in_msを増やしました 助けてくれませんでした。最後に、私は自分のJavaコードでselect節のループを実行してカウントを受け取りました。 1,200万行が7秒でカウントされました。それは速いです。 –

答えて

0

あなたは、あなたのテーブルを再設計、または複数の小さなクエリにクエリを分割することができます。

パーティションキーを使用せずにセカンダリインデックスを使用して選択しています(警告が示すもの)。そうすることで、本質的に全テーブルスキャンを実行します。あなたのノードはあなたの要求を満たすためにすべてのパーティションを調べなければなりません。

データモデルを変更することなく、すべてのパーティションに対して繰り返し実行し、パーティションごとにクエリを1回実行することができます。

select count(*) from test_table where id = 'somePartitionId' and listids contains key 12; 

このように、ノードはこれらの情報を探しているパーティションを知ります。これらのクエリの結果をclientsideに集計する必要があります。

+0

1つの説明..私の場合、 'id'はパーティションキー(分からない)でなければならず、IDはほとんどユニークです(また何百万ものレコード)。 –

+0

あなたのデータモデルをリフォームすることを正直にお勧めします。それにもかかわらず、何百万ものパーティションがあるにもかかわらず、すべてのパーティションを別々に(並行して)クエリすることはできますが、明らかに時間がかかります。 – HashtagMarkus

0

私は同じ問題に直面しました。試みました 1)#無効にするには、Noneに設定することもできます。client_timeout = home .cassandraのcqlshrcにはありません。助けなかった

2)

ym.cassandra.yaml

でtimeout_in_msがあまりにも助けていませんでした*タイムアウトを増加しました。最後に、私は自分のJavaコードでselect節のループを実行してカウントを受け取りました。 1,200万行が7秒でカウントされました。それは速いです。

Cluster cluster = Cluster.builder() 
      .addContactPoints(serverIp) 
      .build(); 

    session = cluster.connect(keyspace); 


    String cqlStatement = "SELECT count(*) FROM imadmin.device_appclass_attributes"; 
    //String cqlStatement = "SELECT * FROM system_schema.keyspaces"; 
    for (Row row : session.execute(cqlStatement)) { 
     System.out.println(row.toString()); 
    } 
関連する問題