es BulkProcessor踩坑记录:es索引模板生成索引分区不正确

背景

使用es bulkProcessor批量插入数据时,发现一个按月分区的索引模板,生成索引的命名却不是规范的,同时存在按月和按日的索引。导致数据更新、删除的时候,无法找到正确的分区。
起初,我以为导致该问题的的原因是分区时间字段格式不正确。后来才知道,是因为和其他按日分区的索引模板使用了同一个BulkProcessor。按日分区的索引模板写数据并发比较高,使用同一个BulkProcessor的时候,不同的分区规则产生了相互影响。

什么是BulkProcessor?

BulkProcessor 是 Elasticsearch 的一个高级客户端 API,它允许您在一次批量操作中执行大量的索引、更新和删除请求。此外,BulkProcessor 还提供了并发和异步处理功能。
BulkProcessor 的实现原理主要包括以下几个方面:

  1. 缓冲区:在 BulkProcessor 内部维护一个缓冲区(通常是一个List或者Queue),用于存储暂时还未发送给 Elasticsearch 服务器的文档。当你添加新文档到 BulkProcessor 时,这些文档会先被放入缓冲区。

  2. 触发条件:BulkProcessor 允许您设置三种触发条件来确定何时将缓冲区中的数据发送至 Elasticsearch 进行批量操作:

    • 文档数量:当达到一定数量的文档时触发。
    • 数据大小:当存储的数据总大小超过指定阈值时触发。
    • 时间间隔:每隔特定时间间隔就会将已有记录发送出去。
  3. 执行器线程池和异步处理: 当满足任意一个触发条件,BulkProcessor 就开始执行批量操作。为了实现异步非阻塞式调用方式, Bulk Processor 使用 ExecutorService 提供了多线程支持,并且回调函数允许进行失败重试和错误策略配置。

  4. 监听器回调: 可以通过实现 org.elasticsearch.action.bulk.BulkProcessor.Listener接口来设定关联监听器,在不同状态下如成功、失败、重试等情景里回调对应方法进行相对应操作。

  5. 关闭与清理: 在使用完毕后需要及时关闭BulkProcessors对象释放资源;此外,在关闭之前需要确保所有正在运行中得任务完成并清空内部队列避免数据丢失。

避免使用同一个BulkProcessor处理不同的索引模板数据

尽管 BulkProcessor 支持同时对多个索引模板进行写入操作,但这种情况可能会遇到两方面的问题:

  1. 配置不同索引模板:每个 BulkRequest 可以包含针对不同索引(具有不同映射和设置)的文档。然而,默认情况下,在创建 BulkProcessor 时需要指定一个固定的 Index Template 或者在构建每个请求时提供自定义配置。

  2. 性能:使用单个 Bulk Processor 同时写入多种类型数据可以导致性能受限,特别是当涉及很大数量或者非常复杂数据时。因为 Elasticsearch 必须解析所有文档并确定它们分配到哪些分片上去。较好地方式是使用多个BulkProcessor来处于各自独立的线程中以实现更有效率地工作负载平衡。

总之,在某些场景下,单个 BulkProcessor 可以同时写入不同索引模板的数据,但可能存在配置复杂度高和性能受限等问题。

每一个BulkProcessor其实对应一个线程池,它起到了资源隔离的作用。

总结

  • BulkProcessor 是 Elasticsearch 的一个高级客户端 API,它允许您在一次批量操作中执行大量的索引、更新和删除请求。
  • 不同的BulkProcessor最好对应不同的索引模板,这满足资源隔离的数据管理要求。

你可能感兴趣的:(Java实战宝典,elasticsearch,java)