ইলাস্টিকসার্কের সাথে সংযোগের সময়সীমা


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: // লোকালহোস্ট: 9200 / কিছু জেসন ফিরিয়ে দিচ্ছে)।

উত্তর:


92

ডিফল্ট হিসাবে, সময়সীমা মান 10 সেকেন্ডে সেট করা হয়। যদি কেউ গ্লোবাল টাইমআউট মান পরিবর্তন করতে চায় তবে অবজেক্টটি তৈরি করার সময় পতাকাটির সময়সীমা = আপনার সময় নির্ধারণ করে এটি অর্জন করা যেতে পারে ।

যদি আপনি ইতিমধ্যে টাইমআউট মানটি নির্দিষ্ট না করে অবজেক্টটি তৈরি করে থাকেন তবে আপনি ক্যোয়ারীতে অনুরোধ_টাইমআউট = আপনার সময়ের পতাকা ব্যবহার করে নির্দিষ্ট অনুরোধের জন্য টাইমআউট মান সেট করতে পারেন ।

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

এটি কি 60 এ সেট করা যায়? আমি এটি 30 সেট করার পরেও টাইমআউট পাচ্ছি
কিশান মেহতা

@ কিশান আপনার দস্তাবেজের শরীরটি কত বড়?
রোহিত পাটোয়া

হাই, @ রোহিতপাটওয়া আমার সমস্যাটি ডকুমেন্টের দৈর্ঘ্য হ্রাস করে সমাধান করা হয়েছিল। আমার মনে নেই এখন শরীর কত বড় ছিল। সহায়তার জন্য ধন্যবাদ :)
কিশান মেহতা

4
যদি আমার বস আমাকে সময়সীমা পরিবর্তন করতে না দেয় এবং এটি একটি একক রেকর্ডে ব্যর্থ হয়?
জোনাথন রাই

19

আপনি যদি অ্যামাজন ইলাস্টিক অনুসন্ধান পরিষেবাটি ব্যবহার করেন তবে সংযোগের সময়সীমা সমস্যা হতে পারে।

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

উপরের পাইথন কোড যেখানে আপনি 9200 থেকে 443 অবধি ডিফল্ট পোর্টটি ওভাররাইড করে এবং এসএসএলকে সত্যে সেট করে দিলে সমস্যাটি সমাধান হবে।

যদি কোনও পোর্ট নির্দিষ্ট না করা থাকে, তবে এটি নির্দিষ্ট হোস্টে 9200 বন্দরটির সাথে সংযোগ স্থাপনের চেষ্টা করছে এবং সময় শেষ হওয়ার পরে ব্যর্থ হয়


অথবা আপনি 80 এস = ইলাস্টিকসার্চ পোর্ট ব্যবহার করতে পারেন ([{'হোস্ট': 'xxxxxx.us-east-1.es.amazonaws.com', 'বন্দর': 80}])
ওলগা আখমেটোভা

5

এটি আপনার সময়সীমা 30 সেকেন্ডে বাড়িয়ে তোলার কিছু নয়। লোকেরা কি আসলেই মনে করে যে একটি ক্ষুদ্র আঘাতটি ফিরিয়ে আনতে স্থিতিস্থাপক অনুসন্ধানের 30 সেকেন্ড পর্যন্ত হওয়া উচিত?

আমি যেভাবে এই সমস্যাটি স্থির করেছি তা হ'ল নিম্নলিখিতটি কনফিগার / ইলাস্টিকস र्च. আইএমএলকে অসুবিধে করতে হবে

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

নেটওয়ার্ক.হোস্ট 192.168.0.1 এ সেট করা হতে পারে যা কাজ করতে পারে তবে আমি কেবল এটিকে 'লোকালহোস্ট' এ পরিবর্তন করেছি


18
যদি সার্ভারটি খুব ব্যস্ত থাকে তবে হ্যাঁ, আপনি একটি ক্ষুদ্র আঘাত দিয়ে এই ত্রুটিটি থাকতে পারেন।
ri দেবরিম্বরীস

অথবা যদি
ডিএনএসের

5

মনে রাখবেন যে es.search(বা es.index) করার সময় শেষ হওয়ার সাধারণ কারণগুলির মধ্যে একটি বড় কোয়েরি আকার। উদাহরণস্বরূপ, আমার বেশ বড় ই এস সূচক আকারের ক্ষেত্রে (> 3 এম নথি), 30 টি শব্দ দিয়ে একটি ক্যোয়ারী অনুসন্ধান করতে প্রায় 2 সেকেন্ড সময় নিয়েছিল, যখন 400 শব্দের সাহায্যে একটি অনুসন্ধানের জন্য 18 সেকেন্ডেরও বেশি সময় লেগেছিল। সুতরাং পর্যাপ্ত পরিমাণের ক্যোয়ারির জন্য এমনকি সময়সীমা = 30 আপনাকে বাঁচাতে পারে না। একটি সহজ সমাধান হল সময়সীমার নীচে উত্তর দেওয়া যেতে পারে এমন প্রশ্নের ক্যোয়ারী ক্রপ করা।

সময়সীমা বাড়াতে বা টাইমআউটে পুনরায় চেষ্টা করা আপনার পক্ষে সহায়তা করবে যদি কারণটি ট্র্যাফিকে ছিল, নাহলে এটি আপনার অপরাধী হতে পারে।


5

ইলেস্টিকসার্ক ইনিশিয়ালাইজেশনে টাইমআউট সেট করার চেষ্টা করুন:

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

আপনি এমনকি একটি numberচ্ছিক নম্বর সেট 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)হয়েছিল যা ব্যবহারিকভাবে কখনই পৌঁছায়নি কারণ সার্ভারে এন্ট্রিগুলি কেবলমাত্র 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 হিসাবে উল্লেখ করে
অ্যালেক্স জোলিগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.