कनेक्शन टाइमआउट एलिस्टिक्स खोज के साथ


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 / / कुछ जौन लौट रहा है)।

जवाबों:


92

डिफ़ॉल्ट रूप से, टाइमआउट मान 10 सेकंड के लिए सेट किया गया है। यदि कोई वैश्विक टाइमआउट मान को बदलना चाहता है, तो ऑब्जेक्ट बनाते समय फ्लैग टाइमआउट = अपना समय निर्धारित करके इसे प्राप्त किया जा सकता है ।

यदि आपने टाइमआउट मान को निर्दिष्ट किए बिना ऑब्जेक्ट पहले ही बना लिया है, तो आप क्वेरी में request_timeout = your-time ध्वज का उपयोग करके विशेष अनुरोध के लिए टाइमआउट मान सेट कर सकते हैं ।

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

क्या इसे 60 पर सेट किया जा सकता है? मैं इसे 30 सेट करने के बाद भी टाइमआउट कर रहा हूं
किशन मेहता

@ किशन तुम्हारा शरीर कितना बड़ा है?
रोहित पटवा

नमस्ते, @RohitPatwa दस्तावेज़ की लंबाई कम करके मेरी समस्या हल हो गई। मुझे याद नहीं कि शरीर अभी कितना बड़ा था। मदद के लिए धन्यवाद :)
किशन मेहता

1
क्या होगा अगर मेरा बॉस मुझे टाइमआउट बदलने नहीं देगा और यह एक रिकॉर्ड पर विफल हो जाता है?
जोनाथन

19

यदि आप Amazon Elastic Search सेवा का उपयोग कर रहे हैं, तो कनेक्शन की समय पर समस्या उत्पन्न हो सकती है।

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

उपरोक्त अजगर कोड जहां आप 9200 से 443 तक डिफ़ॉल्ट पोर्ट को ओवरराइड करते हैं और एसएसएल को सही पर सेट करने से समस्या हल हो जाएगी।

यदि कोई पोर्ट निर्दिष्ट नहीं है, तो वह निर्दिष्ट होस्ट में पोर्ट 9200 से कनेक्ट करने का प्रयास कर रहा है और समय समाप्त होने के बाद विफल हो जाता है


या आप पोर्ट =० es = एलेस्टिक्स खोज ([{: होस्ट ’: x xxxxxx.us-east-1.es.amazonaws.com’, 'पोर्ट ’: ]०}] का उपयोग कर सकते हैं)
ओल्गा

5

30 सेकंड में अपने टाइमआउट को बढ़ाने से इसका कोई लेना-देना नहीं है। क्या लोग वास्तव में सोचते हैं कि एक छोटी हिट को वापस करने के लिए लोचदार खोज को 30 सेकंड तक की आवश्यकता होनी चाहिए?

जिस तरह से मैंने इस समस्या को ठीक किया वह निम्न करने के लिए कॉन्फ़िगर / elasticsearch.yml असहज था

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

Network.host 192.168.0.1 पर सेट हो सकता है जो काम कर सकता है लेकिन मैंने इसे केवल 'लोकलहोस्ट' में बदल दिया है


18
यदि सर्वर बहुत व्यस्त है, तो हाँ, आपको यह त्रुटि एक छोटे से हिट के साथ हो सकती है।
at देवम्बरीस


4

ध्यान दें कि जब es.search(या es.index) बड़े क्वेरी आकार के टाइमआउट के सामान्य कारणों में से एक है । उदाहरण के लिए, एक बहुत बड़े ES इंडेक्स साइज़ (> 3M डॉक्यूमेंट्स) के मेरे मामले में, 30 शब्दों वाली क्वेरी की खोज करने में लगभग 2 सेकंड लगे, जबकि 400 शब्दों वाले क्वेरी की खोज करने में 18 सेकंड से अधिक का समय लगा। तो पर्याप्त रूप से बड़ी क्वेरी के लिए भी समय = 30 आपको नहीं बचाएगा। एक आसान समाधान क्वेरी को उस आकार में क्रॉप करना है जिसका उत्तर टाइमआउट के नीचे दिया जा सकता है।

टाइमआउट बढ़ाने या टाइमआउट पर रिट्रीट करने से यदि ट्रैफिक में कारण होता है, तो यह आपकी मदद करेगा, अन्यथा यह आपका अपराधी हो सकता है।


4

एलियस्टिक्स खोज आरंभ में टाइमआउट की कोशिश करें:

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

तुम भी सेट कर सकते हैं retry_on_timeoutकरने के लिए Trueऔर देना max_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)) मतलब अनुरोध निर्दिष्ट समय में समाप्त नहीं हुआ (डिफ़ॉल्ट रूप से, टाइमआउट = 10)।

यह 30 सेकंड के साथ काम करेगा:

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


1

मेरी व्यक्तिगत समस्या हल हो गई थी (timeout = 10000)जिसके साथ व्यावहारिक रूप से कभी नहीं पहुंचा क्योंकि सर्वर पर प्रविष्टियां केवल 7.000 थीं, लेकिन इसमें भारी ट्रैफ़िक था और इसके संसाधनों को हॉग किया जा रहा था और इसी कारण कनेक्शन गिर रहा था


1

समय समाप्त होने के कारण कई हो सकते हैं और विस्तृत त्रुटि देखने के लिए यह इलास्टिसर्च साइड ( logs/elasticsearch.log) पर लॉग की जांच करने के लायक लगता है । हमारे मामले में, ES पर त्रुटि थी:

primary shard is not active Timeout: [1m]

जैसा कि इस पोस्ट में बताया गया है , यह इसलिए था क्योंकि हमारी डिस्क भरी हुई थी। हमने एक दिन पहले इसे (और विभाजन) को फिर से आकार दिया था, लेकिन अगर उच्च / निम्न वॉटरमार्क एक बार (हम 5.5.x पर हैं) पर ईएस को फिर से शुरू करने की आवश्यकता है जो हमने नहीं किया था।

बस उत्पादन पर ES को पुनः आरंभ करने से हमारे लिए समस्या हल हो गई।


0

दो विकल्प जो मदद करते हैं:

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: पाठ की लंबाई कम करें

यह पाठ की लंबाई को कम करने में भी मदद करता है, जैसे लंबे पाठों को काटकर, इसलिए लोचदार पाठ को तेजी से संग्रहीत कर सकता है जो समयबाह्य होने से बचाएगा:

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

यह त्रुटि के रूप में काम नहीं करेगा क्योंकि अभी भी टाइमआउट मूल्य 10 के रूप में है
एलेक्स जोलीग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.