我创建了一个 AWS Lambda 包 (Java),其中包含一个从 Amazon S3 读取一些文件并将数据推送到 AWS ElasticSearch Service 的函数。由于我使用的是 AWS Elastic Search,因此我无法使用传输客户端,在这种情况下,我正在使用 Jest 客户端通过 REST 推送。问题在于 Jest 客户端。
这是我的 Jest 客户端实例:
public JestClient getClient() throws InterruptedException{
final Supplier<LocalDateTime> clock = () -> LocalDateTime.now(ZoneOffset.UTC);
DefaultAWSCredentialsProviderChain awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();
final AWSSigner awsSigner = new AWSSigner(awsCredentialsProvider, REGION, SERVICE, clock);
JestClientFactory factory = new JestClientFactory() {
@Override
protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) {
builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner));
return builder;
}
@Override
protected HttpAsyncClientBuilder configureHttpClient(HttpAsyncClientBuilder builder) {
builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner));
return builder;
}
};
factory.setHttpClientConfig(
new HttpClientConfig.Builder(URL)
.discoveryEnabled(true)
.multiThreaded(true).build());
JestClient jestClient = factory.getObject();
return jestClient;
}
由于 AWS Elasticsearch 域受 IAM 访问策略的保护,因此我签署请求以使它们获得 AWS 的授权(此处为示例)。我使用 POJO 来索引文档。
我面临的问题是我无法使用 jest 客户端实例执行多个操作。例如,如果我先创建索引:
client.execute(new CreateIndex.Builder(indexName).build());
后来,我想,例如做一些批量索引:
for (Object object : listOfObjects) {
bulkIndexBuilder.addAction(new Index.Builder(object ).
index(INDEX_NAME).type(DOC_TYPE).build());
}
client.execute(bulkIndexBuilder.build());
只有第一个动作会被执行,第二个动作会失败。这是为什么?是否可以执行多个操作?
Morover,使用提供的代码,当我想索引文档时,我无法执行超过 20 个批量操作。基本上,大约 20 个就可以了,但除此之外,client.execute(bulkIndexBuilder.build());
just 不执行并且客户端关闭。
任何帮助或建议都将不胜感激。
更新:AWS ElasticSearch 似乎不允许连接到单个节点。只需在 Jest 客户端中关闭节点发现即可.discoveryEnabled(false)
解决所有问题。这个答案有帮助。