0

我正在尝试在 AWS ElasticSearch 2.3 上使用 Java 中的批量 HTTP api。当我使用休息客户端进行批量加载时,出现以下错误:

504 GATEWAY_TIMEOUT

当我在 Java 中将它作为 Lambda 运行时,对于 HTTP Posts,我得到:

{
  "errorMessage": "2017-01-09T19:05:32.925Z 8e8164a7-d69e-11e6-8954-f3ac8e70b5be Task timed out after 15.00 seconds"
}

通过测试,我注意到批量 API 不适用于以下设置:

    "number_of_shards" : 5,
    "number_of_replicas" : 5

当分片和副本设置为 1 时,我可以进行批量加载没有问题。我也尝试使用此设置来允许我的批量加载:

    "refresh_interval" : -1

但到目前为止,它根本没有任何影响。在 Java Lambda 中,我将数据作为 InputStream 从 S3 位置加载。对于 Java HTTP,我目前有哪些选择?我可以尝试索引设置中的其他内容吗?我可以尝试 AWS 访问策略中的其他内容吗?感谢您的时间。

1编辑:

我也尝试过这些参数: _bulk?action.write_consistency=one&refresh 但到目前为止没有任何区别。

2编辑:

这就是我的批量加载工作的原因 - 设置一致性参数(我不需要设置 refresh_interval):

            URIBuilder uriBuilder = new URIBuilder(myuri);
            uriBuilder = uriBuilder.addParameter("consistency", "one");                
            HttpPost post = new HttpPost(uriBuilder.build());
            HttpEntity entity = new InputStreamEntity(myInputStream);
            post.setEntity(entity); 
4

1 回答 1

2

根据我的经验,当您的集群无法满足您的索引复制设置时,可能会出现此问题。这种情况发生在网络分区期间,或者如果您只是设置了物理集群无法满足的复制要求。

就我而言,当我将生产设置(number_of_replicas:3)应用于我的开发集群(即单节点集群)时,就会发生这种情况。

您的两个解决方案(将副本设置为 1 或将一致性设置为 1)解决了这个问题,因为它们允许 Elastic 继续批量索引而无需等待其他副本上线。

Elastic Search 可能会在失败时提供更直观的消息,也许他们在 Elastic 5 中会这样做。

将集群设置为单个

于 2017-02-13T17:05:57.417 回答