2016-05-13 4 views
1

Die Abfrage:Elasticsearch circuit_breaking_exception (Data zu groß) mit significant_terms Aggregation

{ 
    "aggregations": { 
    "sigTerms": { 
     "significant_terms": { 
     "field": "translatedTitle" 
     }, 
     "aggs": { 
     "assocs": { 
      "significant_terms": { 
      "field": "translatedTitle" 
      } 
     } 
     } 
    } 
    }, 
    "size": 0, 
    "from": 0, 
    "query": { 
    "range": { 
     "timestamp": { 
     "lt": "now+1d/d", 
     "gte": "now/d" 
     } 
    } 
    }, 
    "track_scores": false 
} 

Fehler:

{ 
    "bytes_limit": 6844055552, 
    "bytes_wanted": 6844240272, 
    "reason": "[request] Data too large, data for [<reused_arrays>] would be larger than limit of [6844055552/6.3gb]", 
    "type": "circuit_breaking_exception" 
} 

Indexgröße ist 5G. Wie viel Speicher benötigt der Cluster, um diese Abfrage auszuführen?

+0

Welche ES-Version? –

+0

@AndreiStefan ES-Version ist 2.2.0 –

Antwort

1

Sie können versuchen, die request circuit breaker Grenze auf 41% zu erhöhen (Standard: 40%) in Ihrer elasticsearch.yml Config-Datei und starten Sie den Cluster:

indices.breaker.request.limit: 41% 

Oder wenn Sie es vorziehen, nicht den Cluster neu starten, können Sie ändern, die Einstellung dynamisch mit:

curl -XPUT localhost:9200/_cluster/settings -d '{ 
    "persistent" : { 
    "indices.breaker.request.limit" : "41%" 
    } 
}' 

durch die Zahlen zu urteilen zeigt sich (dh "bytes_limit": 6844055552, "bytes_wanted": 6844240272), sind Sie gerade fehlt ~ 190 KB Heap, so Erhöhung um 1% auf 41% Sie 17 MB zusätzlichen Haufen bekommen sollte (Ihre Summe h eap = ~ 17GB) für Ihren Request Breaker, der ausreichend sein sollte.

Stellen Sie sicher, dass Sie diesen Wert nicht zu hoch erhöhen, da Sie das Risiko eingehen, dass OOM ausgeführt wird, da der Anforderungsleistungsschalter auch den Heap mit dem Felddatenschutzschalter und anderen Komponenten teilt.

+0

Hey @esp, haben Sie das ausprobieren können? – Val

+1

So funktioniert die Speicherschätzung nicht - 'bytes_wanted' ist keine genaue Zahl, sondern eine Näherung. Wenn Sie das Limit um einen kleinen Prozentsatz erhöhen, wird wahrscheinlich der gleiche Fehler auftreten, nur mit einem etwas höheren Wert von "Bytes_Grenze"/"Bytes_Gebiet". –

+0

Das war nur zur Veranschaulichung, natürlich, wenn er diesen Ansatz annimmt, muss er versuchen zu sehen, was für ihn funktioniert. – Val

2

Leistungsschalter sind für Situationen ausgelegt, in denen die Verarbeitung von Anforderungen mehr Speicher benötigt als verfügbar ist. Sie können Grenze gesetzt durch folgende Abfrage

PUT /_cluster/settings 
{ 
    "persistent" : { 
    "indices.breaker.request.limit" : "45%" 
    } 
} 

verwenden, können Sie weitere Informationen zu erhalten, auf

https://www.elastic.co/guide/en/elasticsearch/reference/current/circuit-breaker.html https://www.elastic.co/guide/en/elasticsearch/reference/1.4/index-modules-fielddata.html

3

Ich bin nicht sicher, was Sie versuchen zu tun, aber ich bin gespannt, aus. Da Sie diese Ausnahme erhalten, kann ich annehmen, dass die Kardinalität dieses Feldes nicht klein ist. Du versuchst grundsätzlich, die Beziehungen zwischen allen Begriffen in diesem Bereich basierend auf der Bedeutung zu sehen.

Die erste significant_terms Aggregation alle die Bedingungen aus diesem Bereich prüfen wird und festzustellen, wie „signifikant“ sind sie (Frequenzen dieses Begriffs in dem gesamten Index zu berechnen und dann die mit den Frequenzen aus dem range Abfrage Satz von Dokumenten zu vergleichen).

Nachdem es (für alle Begriffe) tut, möchten Sie eine zweite significant_aggregation, die den ersten Schritt tun sollte, aber jetzt unter Berücksichtigung jedes Begriffes und dafür eine andere significant_aggregation. Das wird schmerzhaft sein. Grundsätzlich berechnen Sie number_of_term * number_of_terms significant_terms Berechnungen.

Die große Frage ist was versuchen Sie zu tun?

Wenn Sie eine Beziehung zwischen allen Begriffen in diesem Feld sehen möchten, wird das aus den oben genannten Gründen teuer. Mein Vorschlag ist, eine erste significant_terms Aggregation auszuführen, die ersten 10 Begriffe oder so zu nehmen und dann eine zweite Abfrage mit einer anderen significant_terms Aggregation auszuführen, aber die Bedingungen zu begrenzen, indem wahrscheinlich ein Elternteil terms Aggregation und include only those 10 from the first query aggregiert wird.

Sie können auch einen Blick auf sampler aggregation werfen und verwenden Sie das als übergeordnetes Element für Ihre nur eine wichtige Begriffe Aggregation.

Auch ich denke nicht, dass die Erhöhung der Leistungsschalter Grenze ist die echte Lösung. Diese Grenzen wurden mit einem Grund gewählt. Sie können das erhöhen und vielleicht wird es funktionieren, aber es muss Sie fragen, ob das die richtige Abfrage für Ihren Anwendungsfall ist (wie es nicht wie es klingt) ist. Dieser Grenzwert, der in der Exception enthalten ist, ist möglicherweise nicht der letzte ... reused_arrays bezieht sich auf eine Array-Klasse in Elasticsearch, die resizierbar ist. Wenn also mehr Elemente benötigt werden, wird die Array-Größe erhöht und Sie können den Schutzschalter erneut drücken. für einen anderen Wert.

Verwandte Themen