AWS Ошибка Elasticsearch TransportError (413, '') - PullRequest
1 голос
/ 31 марта 2020

Мы используем python версию API Flexiblesearch "asticsearch-6.8.0 "с AWS Elasticsearch версии 6.7

Это случается иногда только на некоторых машинах (даже когда мы выполняем запросы в течение секунд друг от друга с разных машин, одна удастся, а другая сгенерирует ошибку). Таким образом, это трудно воспроизвести. Мы используем поиск с разбивкой по страницам, как это:

def scrolled_search_query(self, index, query, size=es_config.ES_SIZE,
                              scroll=es_config.ES_SCROLL,
                              request_timeout=es_config.ES_TIMEOUT,
                              docs_only=False):
        data = self.es_conn.search(index=index, size=size, scroll=scroll, body=query,
                                   request_timeout=request_timeout)

        while len(data['hits']['hits']) > 0:
            for hit in data['hits']['hits']:
                if docs_only:
                    yield hit['_source']
                else:
                    yield hit

            data = self.es_conn.scroll(scroll_id=data['_scroll_id'], scroll=scroll,
                                       request_timeout=request_timeout)

Сообщение об ошибке совершенно бесполезно, просто в основном говорится, что есть 413. как это:

TransportError: TransportError(413, '')

При просмотре форумов кажется, что проблема в том, что ES пытается вернуть большую полезную нагрузку. Однако, поскольку мы используем разбиение на страницы прокрутки, я не знаю, почему это будет проблемой, потому что каждая полезная нагрузка должна быть значительно ниже предела в 100 МБ. Поскольку сообщение об ошибке так ужасно, я не могу понять, что он пытается сделать в базе данных. Похоже, что база данных вычисляет общие данные для запроса и отклоняет их без учета разбиения на страницы. Для нас нормально запрашивать большие полезные нагрузки и разбивать их на страницы.

Полное исключение выглядит следующим образом, что еще вам нужно?

---------------------------------------------------------------------------
TransportError                            Traceback (most recent call last)
<ipython-input-3-a3fd964bf999> in <module>
     41                                  blah=blah,
     42                                  blah=blah,
---> 43                                  start_date=start_date)
     44 
     45         df = df.drop(['@blah', '@blah'], axis=1)
~/Documents/Repositories/blah/blah/downloader.py in get_data(self, data_type, blah, blah, device, blah, start_date, end_date)
    186             return self.gatorEs.get_blah(es_requests=self.es_requests, blah=blah, blah=blah, blah=blah,
--> 188                                            start_date=start_date, end_date=end_date)
    189 
    190         if data_type == 'blah':
~/Documents/Repositories/gator_access/gator_access/es_gator_api.py in get_blah(self, es_requests, blah, blah, blah, blah, blah, start_date, end_date)
    180                                             logger=self.logger)
    181                     if not data: continue
--> 182                     es_data += data
    183 
    184         self.logger.info(" ".join(["Download took {t} seconds for p:'{p}' d:'{d}'",
~/Documents/Repositories/gator_core/gator_core/elasticsearch/es_requests.py in scrolled_search_query(self, index, query, size, scroll, request_timeout, docs_only)
    144 
    145             data = self.es_conn.scroll(scroll_id=data['_scroll_id'], scroll=scroll,
--> 146                                        request_timeout=request_timeout)
    147 
    148 
~/anaconda3/envs/prognostic/lib/python3.6/site-packages/elasticsearch/client/utils.py in _wrapped(*args, **kwargs)
     82                 if p in kwargs:
     83                     params[p] = kwargs.pop(p)
---> 84             return func(*args, params=params, **kwargs)
     85 
     86         return _wrapped
~/anaconda3/envs/prognostic/lib/python3.6/site-packages/elasticsearch/client/__init__.py in scroll(self, scroll_id, body, params)
   1353         """
   1354         return self.transport.perform_request(
-> 1355             "GET", _make_path("_search", "scroll", scroll_id), params=params, body=body
   1356         )
   1357 
~/anaconda3/envs/prognostic/lib/python3.6/site-packages/elasticsearch/transport.py in perform_request(self, method, url, headers, params, body)
    351                     headers=headers,
    352                     ignore=ignore,
--> 353                     timeout=timeout,
    354                 )
    355 
~/anaconda3/envs/prognostic/lib/python3.6/site-packages/elasticsearch/connection/http_requests.py in perform_request(self, method, url, params, body, timeout, ignore, headers)
    139                 raw_data,
    140             )
--> 141             self._raise_error(response.status_code, raw_data)
    142 
    143         self.log_request_success(
~/anaconda3/envs/prognostic/lib/python3.6/site-packages/elasticsearch/connection/base.py in _raise_error(self, status_code, raw_data)
    160 
    161         raise HTTP_EXCEPTIONS.get(status_code, TransportError)(
--> 162             status_code, error_message, additional_info
    163         )
TransportError: TransportError(413, '')
...