2016-07-25 11 views
1

Wir haben eine Tabelle, die wie folgt aussieht:Cassandra Leistungsproblem

CREATE TABLE arc_dynamic.transit_map (
    sal text, 
    pfn text, 
    transit_map_id text, 
    create_program_id text, 
    create_timestamp timestamp, 
    cutoff_times map<text, text>, 
    derived_priority int, 
    effective_date text, 
    modify_program_id text, 
    modify_timestamp timestamp, 
    relationship_type_id text, 
    solr_query text, 
    stop set<text>, 
    transit_days map<text, int>, 
    trigger_id text, 
    PRIMARY KEY (sal, pfn, transit_map_id) 
) WITH CLUSTERING ORDER BY (pfn ASC, transit_map_id ASC) 
    AND 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 CUSTOM INDEX arc_dynamic_transit_map_create_timestamp_index ON arc_dynamic.transit_map (create_timestamp) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 
CREATE CUSTOM INDEX arc_dynamic_transit_map_derived_priority_index ON arc_dynamic.transit_map (derived_priority) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 
CREATE CUSTOM INDEX arc_dynamic_transit_map_modify_timestamp_index ON arc_dynamic.transit_map (modify_timestamp) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 
CREATE CUSTOM INDEX arc_dynamic_transit_map_relationship_type_id_index ON arc_dynamic.transit_map (relationship_type_id) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 
CREATE CUSTOM INDEX arc_dynamic_transit_map_solr_query_index ON arc_dynamic.transit_map (solr_query) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 
CREATE CUSTOM INDEX arc_dynamic_transit_map_trigger_id_index ON arc_dynamic.transit_map (trigger_id) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 

Wenn ich laufen:

select * from transit_map where sal='XXX_953'; 

Es mal aus:

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

Wenn ich es begrenzen zu 10 Reihen oder weniger, es kommt zurück. Alles andere, mal aus. Ich versuche herauszufinden, wo es falsch läuft (entweder zu viele Stable, Tombstones, etwas anderes), aber ich kann mir nicht vorstellen, wie ich dazu komme.

Ich habe die Ablaufverfolgung aktiviert. Für die 10-Zeilen-Grenze oder weniger sieht es nicht "schlecht aus" (zumindest hat es eine Ausgabe).

Wenn ich 11 Zeile Grenze, oder lassen Sie es leer (keine Begrenzung), keine Ausgabe kommt zurück von der Verfolgung.

Jede Hilfe, wo zu gehen ist sehr geschätzt. Ich komme aus einem langjährigen Oracle-Hintergrund und bin davon verschont, wie ich das in Cassandra herausfinden kann.

+0

Wie viele Zeilen erwarten Sie mit dieser Abfrage zurück? – Aaron

Antwort

1

Erstellen von Karten und anderen Objekten sind schwere Operationen für Cassandra. Falls diese Karten nicht in ihrer Größe eingeschränkt sind, sind Zeitüberschreitungen wie diese ziemlich üblich.

Aus eigener Erfahrung Kartengrößen sollten nicht über ein paar Dutzend oder so sein.

Versuchen Sie, Ihre Daten so zu modellieren, dass Karten in ihrer Größe sehr eingeschränkt sind oder sogar, dass Sie sie überhaupt nicht verwenden. eine Lösung kann transit_days zu uuid Art werden verändert und eine Verbindungstabelle aufweist, die etwa wie folgt aussieht:

CREATE TABLE arc_dynamic.transit_map_days_per ( transit_day_id uuid, data text PRIMARY KEY (transit_day_id) )

würden Sie dann in der Lage sein, die „Karte“ aus dieser Tabelle zu erhalten, wie eine Liste von Tupeln und manipulieren es auf Ihrem Ende

+0

raam86, ich schätze es sehr, dass Sie sich die Zeit genommen haben, Ihnen diesbezüglich einen Rat zu geben. Wenn ich vom Feuer lerne, wäre meine nächste Frage: Wie würde man wissen, dass das tatsächlich das Problem ist? Wo würde ich aussehen? Da Trace nichts ausgibt, weiß ich nicht einmal wo ich sonst hinschauen müsste. Ich habe versucht, mein Client-Timeout zu erhöhen, indem ich den client_timeout-Wert in meiner cqlshrc-Datei festlegte, aber das hat nicht geholfen. Ich schätze, das ist zum Verbinden, nicht abfragen, aber nicht sicher. Selbst wenn es funktioniert hätte, und ich bekam Zeilen zurück, würde es irgendwelche Hinweise geben, dass die Karte das Problem war? –

+0

Am einfachsten ist es, die problematische Karte zu entfernen und zu sehen, was passiert. Sie können immer einen Dump erstellen. JVM-Dump und Suche nach Cassandra-Benchmark, sie haben einige Tools für Statistiken, die ich derzeit nicht erinnere und auch http://aryanet.com/blog/cassandra-garbage-collector-tuning – raam86

+0

raam86, danke für die Köpfe darüber . Was ich von einigen anderen im Team herausgefunden habe, ist, dass sie nie mehr als 14 Elemente in der Map haben und dass das Problem tatsächlich ein Bug mit der Datastax-Version war, in der wir arbeiten und dass das Problem durch Komprimierung und Reparatur behoben wird. Ich schätze deine Antwort jedoch und werde mehr damit spielen. Mehr lernen jeden Tag ... –