3

我创建了一个 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)解决所有问题。这个答案有帮助。

4

0 回答 0