Elasticsearchとの接続タイムアウト


86
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'])

この単純なコードは、次のエラーを返します。

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

サーバーの準備ができて設定されているため、非常に奇妙です(http:// localhost:9200 /がjsonを返しています)。

回答:


92

デフォルトでは、タイムアウト値は10秒に設定されています。グローバルタイムアウト値を変更したい場合は、オブジェクトの作成中にフラグtimeout = your-timeを設定することでこれを実現できます。

タイムアウト値を指定せずにオブジェクトを既に作成している場合は、クエリでrequest_timeout = your-timeフラグを使用して、特定のリクエストのタイムアウト値を設定できます。

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

これを60に設定できますか?30に設定してもタイムアウトになります
Kishan Mehta 2017

@Kishanあなたの体の大きさはどれくらいですか?
Rohit Patwa 2017年

こんにちは、@ RohitPatwa私の問題は、ドキュメントの長さを短くすることで解決しました。今の体の大きさは覚えていません。助けてくれてありがとう:)
Kishan Mehta 2017年

1
上司がタイムアウトの変更を許可せず、1つのレコードで失敗した場合はどうなりますか?
JonathanRys20年

19

Amazon Elastic Searchサービスを使用している場合、接続タイムアウトの問題が発生する可能性があります。

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

デフォルトのポートを9200から443にオーバーライドし、SSLをtrueに設定する上記のPythonコードは、問題を解決します。

ポートが指定されていない場合、指定されたホストのポート9200に接続しようとしており、タイムアウト後に失敗します。


または、ポート80 es = Elasticsearch([{'host': 'xxxxxx.us-east-1.es.amazonaws.com'、 'port':80}])
Olga Akhmetova

5

これは、タイムアウトを30秒に増やすこととは関係ありません。人々は実際に、Elastic Searchが1つの小さなヒットを返すのに最大30秒かかると考えていますか?

この問題を修正する方法は、config /elasticsearch.ymlに移動し て次のコメントを解除することでした

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

Network.hostは192.168.0.1に設定されている可能性がありますが、これは機能する可能性がありますが、「localhost」に変更しただけです。


18
サーバーがビジー状態の場合は、はい、1回の小さなヒットでこのエラーが発生する可能性があります。
ᐅdevrimbaris

または、DNS解決に問題がある場合、タイムアウトには多くの理由があります
Ethranes

5

実行時のタイムアウトの一般的な理由の1つに注意してくださいes.search(またはes.index)のクエリサイズが大きいことです。たとえば、ESインデックスサイズがかなり大きい(> 3Mドキュメント)場合、30ワードのクエリの検索には約2秒かかりましたが、400ワードのクエリの検索には18秒以上かかりました。したがって、十分に大きなクエリの場合、timeout = 30でも保存されません。簡単な解決策は、タイムアウト未満で回答できるサイズにクエリをトリミングすることです。

原因がトラフィックにある場合は、タイムアウトを増やすか、タイムアウトで再試行を行うと役立ちます。そうでない場合は、これが原因である可能性があります。


5

Elasticsearchの初期化でタイムアウトを設定してみてください。

es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30)

オプションの番号を設定retry_on_timeoutして指定することもできます。Truemax_retries

es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30, max_retries=10, retry_on_timeout=True)

3

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10)) リクエストが指定された時間内に終了しなかったことを意味します(デフォルトでは、timeout = 10)。

これは30秒で動作します:

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


1

私の個人的な問題は解決されまし(timeout = 10000)たが、サーバー上のエントリはわずか7.000でしたが、トラフィックが多く、リソースが占有されていたため、接続が切断されていました。


1

タイムアウトの理由はたくさんある可能性があり、elasticsearch側(logs/elasticsearch.log)のログをチェックして詳細なエラーを確認する価値があるようです。私たちの場合、ESのエラーは次のとおりです。

primary shard is not active Timeout: [1m]

この投稿で説明されているように、これはディスクがいっぱいだったためです。その処理のために1日前にサイズを変更しましたが(5.5.xを使用している場合)、高/低ウォーターマークが1回ヒットした場合は、ESを再起動する必要があります。

本番環境でESを再起動するだけで、問題は解決しました。


0

役立つ2つのオプション:

1:タイムアウトを増やす

タイムアウトを設定すると、この問題は解決しました。新しいバージョンにはユニットが必要であることに注意してください。例timeout="60s"

es.index(index=index_name, doc_type="domains", id=domain.id, body=body, timeout="60s")

単位がない場合、たとえば設定するとtimeout=60、次のようになります。

elasticsearch.exceptions.RequestError: RequestError(400, 'illegal_argument_exception', 'failed to parse setting [timeout] with value [60] as a time value: unit is missing or unrecognized')

2:テキストの長さを短くする

また、長いテキストを切り取るなどしてテキストの長さを短縮するのにも役立ちます。これにより、elasticはテキストをより速く保存できるため、タイムアウトも回避できます。

es.index(index=index_name, doc_type="domains", id=domain.id, body=text[:5000], timeout="60s")

タイムアウト値を10として示すエラーがまだ存在するため、これは機能しません
AlexJolig20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.