webentwicklung-frage-antwort-db.com.de

Verbindungs-Timeout mit Elasticsearch

from datetime import datetime
from elasticsearch import Elasticsearch
es = Elasticsearch()

doc = {
    'author': 'kimchy',
    'text': 'Elasticsearch: cool. bonsai cool.',
    'timestamp': datetime(2010, 10, 10, 10, 10, 10)
}
res = es.index(index="test-index", doc_type='Tweet', id=1, body=doc)
print(res['created'])

Dieser einfache Code gibt den folgenden Fehler zurück:

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(Host='localhost', port=9200): Read timed out. (read timeout=10))

Sehr seltsam, da der Server bereit und eingestellt ist ( http: // localhost: 9200/ gibt etwas Json zurück).

Danke im Voraus!

49
Johann Gomes

Standardmäßig ist der Timeout-Wert auf 10 Sekunden eingestellt. Wenn Sie den globalen Timeout-Wert ändern möchten, können Sie dies erreichen, indem Sie beim Erstellen des Objekts das Flag timeout = Ihre Zeit setzen.

Wenn Sie das Objekt bereits ohne Angabe des Timeout-Werts erstellt haben, können Sie den Timeout-Wert für eine bestimmte Anforderung mithilfe von request_timeout = your-time in der Abfrage festlegen.

es.search(index="my_index",
          doc_type="document",
          body=get_req_body(),
          request_timeout=30)
49
Rahul

Wenn Sie den Amazon Elastic Search-Dienst verwenden, kann das Zeitüberschreitungsproblem der Verbindung auftreten.

es = Elasticsearch ([{'Host': 'xxxxxx.us-east-1.es.amazonaws.com', 'port': 443, 'use_ssl': True}])

Der obige Python-Code, bei dem Sie den Standardport von 9200 bis 443 überschreiben und den Wert für ssl auf true setzen, wird das Problem beheben.

Wenn kein Port angegeben ist, versucht er, eine Verbindung zum pprt 9200 im angegebenen Host herzustellen und schlägt nach einer Zeitüberschreitung fehl

7
Mukund

Dies hat nichts damit zu tun, dass Sie Ihr Timeout auf 30 Sekunden erhöhen. Denken Sie tatsächlich, dass die elastische Suche bis zu 30 Sekunden dauern sollte, um einen winzigen Treffer zu erzielen?

Wie ich dieses Problem behoben habe, war unter config/elasticsearch.yml Folgendes zu kommentieren

http.port: 9200
network.Host: 'localhost' 

Network.Host ist möglicherweise auf 192.168.0.1 gesetzt, was möglicherweise funktioniert. Ich habe es jedoch in 'localhost' geändert. 

5
whoopididoo

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(Host='localhost', port=9200): Read timed out. (read timeout=10)) bedeutet, dass die Anforderung nicht in der angegebenen Zeit beendet wurde (standardmäßig Timeout = 10).

Dies funktioniert mit 30 Sekunden:

res = es.index(index="test-index", doc_type='Tweet', id=1, body=doc, timeout=30)

1
Mir Ilias

mein persönliches Problem wurde mit (timeout = 10000) gelöst, das praktisch nie erreicht wurde, da die Einträge auf dem Server nur 7.000 betrugen, es aber zu starkem Datenverkehr kam und die Ressourcen ausgelastet waren. Deshalb brach die Verbindung ab 

0
Evan

Beachten Sie, dass einer der häufigsten Gründe für Timeouts beim Ausführen von es.search (oder es.index) eine große Abfragegröße ist. In meinem Fall mit einem ziemlich großen ES-Index (> 3M-Dokumente) dauerte die Suche nach einer Abfrage mit 30 Wörtern etwa 2 Sekunden, während die Suche nach einer Abfrage mit 400 Wörtern über 18 Sekunden dauerte. Für eine ausreichend große Abfrage rettet sogar das Timeout = 30 Sie nicht. Eine einfache Lösung besteht darin, die Abfrage auf die Größe zuzuschneiden, die unterhalb des Timeouts beantwortet werden kann.

Das Erhöhen der Zeitüberschreitung oder Wiederholungsversuche bei Zeitüberschreitungen hilft Ihnen, wenn die Ursache im Verkehr war, andernfalls könnte dies Ihr Täter sein.

0
vlyubin