我使用Elasticsearch-1.1.0来索引推文。 索引过程没问题。 然后我升级了版本。现在我使用Elasticsearch-1.3.2,我随机收到这条消息:
Exception happened: Error raised when there was an exception while talking to ES.
ConnectionError(HTTPConnectionPool(host='127.0.0.1', port=8001): Read timed out. (read timeout=10)) caused by: ReadTimeoutError(HTTPConnectionPool(host='127.0.0.1', port=8001): Read timed out. (read timeout=10)).
随机性快照:
Happened --33s-- Happened --27s-- Happened --22s-- Happened --10s-- Happened --39s-- Happened --25s-- Happened --36s-- Happened --38s-- Happened --19s-- Happened --09s-- Happened --33s-- Happened --16s-- Happened
--XXs-- = after XX seconds
有人可以指出如何解决Read timed out
问题吗?
非常感谢。
答案 0 :(得分:22)
由于您看到的错误与您正在使用的客户端相关联,因此很难直接回答。但是,解决方案可能是以下之一:
1.通过传递timeout参数创建ES客户端时,全局增加默认超时。 Python中的示例
es = Elasticsearch(timeout=30)
2.设置客户端每个请求的超时时间。摘自下面的Elasticsearch Python文档。
# only wait for 1 second, regardless of the client's default
es.cluster.health(wait_for_status='yellow', request_timeout=1)
以上将为群集提供一些额外的时间来回复
答案 1 :(得分:20)
试试这个:
es = Elasticsearch(timeout=30, max_retries=10, retry_on_timeout=True)
它可能不会完全避免ReadTimeoutError
,但它会将它们缩小。
答案 2 :(得分:2)
对于它的价值,我发现这似乎与一个破碎的索引状态有关。
要可靠地重新创建这个问题非常困难,但我已经多次见过它了;操作正常运行,除了某些周期性似乎挂起ES的(特别是刷新索引)。
删除索引(curl -XDELETE http://localhost:9200/foo
)并从头开始重新编制索引,为我修复此问题。
如果您看到此行为,我建议您定期清除并重新编制索引。
答案 3 :(得分:1)
当查询大小很大时,读取超时也会发生。例如,在我的ES索引很大(> 3M文档)的情况下,用30个单词的查询进行搜索大约需要2秒钟,而用400个单词的查询进行搜索需要18秒钟以上。因此,对于足够大的查询,即使timeout=30
也无法挽救您。一种简单的解决方案是将查询裁剪为在超时以下可以回答的大小。
答案 4 :(得分:0)
增加各种超时选项可能会立即解决问题,但不能解决根本原因。
提供了ElasticSearch服务可用并且索引运行良好,请尝试增加Java的最小和最大堆大小:请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/jvm-options.html。
TL; DR编辑/etc/elasticsearch/jvm.options -Xms1g
和-Xmx1g
答案 5 :(得分:0)
您还应该检查是否所有都带有弹性。某些分片可能不可用,这是有关分片https://www.datadoghq.com/blog/elasticsearch-unassigned-shards/
不可用的可能原因的很好的文档答案 6 :(得分:0)
以防万一有人在这里尝试了一切,但没有任何效果...
将问题一分为二,检查Elasticsearch是否真的可以,请尝试在命令行上运行以下任何命令:
curl localhost:9200/_cat/indices
curl -XGET 'http://localhost:9200/_cluster/state?pretty'
万一它们不起作用(因此与Python无关),请检查/etc/elasticsearch.yaml(在Ubuntu上的配置,在这种情况下已打包)。可能是文件配置错误(由于进行了旧的实验,我使用了该文件)。 尝试注释掉所有内容,然后再次检查命令,然后检查是否有效,然后回到Python。