Java使用BulkProcessor批量写elasticsearch

pre

业务需求,探索的时候踩了坑,记录下来以备查阅,工作之余时间不多,简单记录问题和解决方案,后续有精力再补全

background

bulk是es的批量写的命令,bulkprocessor是官方对于bulk操作的进一步封装,可以控制单次批处理的数据量,以防单次数据量过多引起的连接错误

踩过的坑

  • 找不到bulkprocessor
    在网上找不到类所在的jar包,后续确认通过maven管理依赖,添加如下依赖即可

            org.elasticsearch.client
            elasticsearch-rest-high-level-client
            7.3.0
        
  • prebuildtransportclient 不存在
    transportclient是es早期引入的传输客户端,其中大多数的构造方法已经被标记成被移出状态,7.x版本之后的es api中移除了prebuildtransportclient,官方推荐使用RestHighLevelClient来替代TransportClient,因此将其替换成RestHighLevelClient即可
    ps:RestHighLevelClient 是依赖Http连接,依赖api中的RestClient,后续的一些配置也需要完成对应修改

  • BulkProcessor.Listener 的三个方法的触发条件
    beforeBulk : 在每次执行之前出发
    afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) : es正确执行语句之后触发,正确执行指的是输入符合es的限制,可以被es正确处理,部分请求可能执行失败,失败的记录可以通过bulkResponse来获取相关信息
    afterBulk(long l, BulkRequest bulkRequest, Throwable throwable) : es无法正确执行完所有语句时触发,可能包含链接关闭等错误

  • BulkProcessor.close之后程序还再继续类型
    BulkProcessor关闭并不会关闭底层的Client,关闭client才会正式结束
    ps:需要注意,如果存在异步任务,需要保证异步任务执行完成后再关闭client

  • RestHighLevelClient增加账号密码验证

esClient =new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("127.0.0.1",9200)
                ).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                        httpClientBuilder.disableAuthCaching();
                        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                })/*.setMaxRetryTimeoutMillis(2000)*/
        );

reference

https://blog.csdn.net/m0_37817986/article/details/89374996
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-document-bulk.html
https://discuss.elastic.co/t/prebuilttransportclient-doesnt-exist-in-my-6-3-0-library/156223

你可能感兴趣的:(Java使用BulkProcessor批量写elasticsearch)