elasticSearch大量数据查询导出报错解决es

这篇具有很好参考价值的文章主要介绍了elasticSearch大量数据查询导出报错解决es。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题1:使用easyExcel从es导出大量数据时报错

错误原因

elasticsearch的client包下的HeapBufferedAsyncResponseConsumer类中传入了bufferLimit,该值

org.apache.http.nio.protocol.HttpAsyncResponseConsumer 的默认实现。在堆内存中缓冲整个响应内容,这意味着缓冲区的大小等于响应的内容长度。根据可配置的参数限制可以读取的响应的大小。如果实体长于配置的缓冲区限制,则引发异常。

的大小决定了es查询数据量的大小,默认时10M,(1010241024),查询出的数据量大于10M则会报错。

错误描述

java.util.concurrent.ExecutionException: org.apache.http.ContentTooLongException: entity content is too long [109077969] for the configured buffer limit [104857600]

解决方案

观察发现bufferLimit的值使用final修饰,最开始传入是从RequestOptions的HttpAsyncResponseConsumerFactory参数传进入的DEFAULT_BUFFER_LIMIT该值是固定的,因此使用反射替换HttpAsyncResponseConsumerFactory参数,替换新的参数设置新值即可!

代码执行位置:随意,只要让改代码执行了即可,可以通过实现ApplicationRunner在run方法中执行,也可以将其放在类中的static中进行执行

//设置es查询buffer大小
        RequestOptions requestOptions = RequestOptions.DEFAULT;
        Class<? extends RequestOptions> reqClass = requestOptions.getClass();
        Field reqField = null;
        try {
            reqField = reqClass.getDeclaredField("httpAsyncResponseConsumerFactory");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        reqField.setAccessible(true);
        //去除final
        Field modifiersField = null;
        try {
            modifiersField = Field.class.getDeclaredField("modifiers");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        modifiersField.setAccessible(true);
        try {
            modifiersField.setInt(reqField, reqField.getModifiers() & ~Modifier.FINAL);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        //设置默认的工厂
        try {
            reqField.set(requestOptions, new HttpAsyncResponseConsumerFactory() {
                @Override
                public HttpAsyncResponseConsumer<HttpResponse> createHttpAsyncResponseConsumer() {
                    //500MB
                    return new HeapBufferedAsyncResponseConsumer(5 * 100 * 1024 * 1024);
                }
            });
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

代码参考链接:发现其中第一种方法行不通哈,因为final修饰原因。

问题2:在从test的db往dev的es同步数据时候报错,使用的SpringDataElasticSearch提供的saveAll()方法

错误描述

org.springframework.data.elasticsearch.UncategorizedElasticsearchException: Elasticsearch exception [type=es_rejected_execution_exception, reason=rejected execution of coordinating operation [coordinating_and_primary_bytes=0, replica_bytes=0, all_bytes=0, coordinating_operation_bytes=115005979, max_coordinating_and_primary_bytes=103887667]]; nested exception is ElasticsearchStatusException[Elasticsearch exception [type=es_rejected_execution_exception, reason=rejected execution of coordinating operation [coordinating_and_primary_bytes=0, replica_bytes=0, all_bytes=0, coordinating_operation_bytes=115005979, max_coordinating_and_primary_bytes=103887667]]]

解决方案:

将大数据量的集合数据进行分割,分割后异步执行saveAll()即可。遇到数据量为12w,拆成了3组,阈值未知。

补充一下问题3

问题3

问题描述:elasticsearch查询不进行分页时查询数据报错

Result window is too large, from + size must be less than or equal to: [10000] but was [78020]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting.文章来源地址https://www.toymoban.com/news/detail-415473.html

解决方案

  1. 通过脚本设置参数的值max_result_window
    2.通过elasticsearchTemplate进行putMapping操作,第二个参数传入相关设置的值
    推荐使用方法2,在项目启动是进行设置校验
    方法1自行百度
    方法2code
@Component
public class InitEsIndex implements ApplicationRunner {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Autowired
    private DictEsService dictEsService;

    @Override
    public void run(ApplicationArguments args) {

        Map<String, Object> settings = new LinkedHashMap<>();
        settings.put("max_result_window", 2000000000);

        //更新索引mapping
        baseTaskExecutor.execute(() -> {
            boolean checkIndex = elasticsearchRestTemplate.indexExists(Demo.class);
            if (checkIndex) {
                elasticsearchRestTemplate.putMapping(Demo.class);
            } else {
                elasticsearchRestTemplate.createIndex(Demo.class, settings);
                elasticsearchRestTemplate.putMapping(Demo.class);
            }
            //teacherEsService.syncTeacherListToEs(new TeacherQueryDto());
        });
    }
}

到了这里,关于elasticSearch大量数据查询导出报错解决es的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch中查询406无显示数据的解决方法

    在docker安装了elasticsearch-head:5和elasticsearch:6.3.2之后,打开界面连接es时发现数据无法展示。 elasticsearch 6增加了请求头严格校验的原因,并且返回结果是 { \\\"error\\\" : \\\"Content-Type header [application/x-www-form-urlencoded] is not supported\\\", \\\"status\\\" : 406 } 解决办法: 找到vendor.js文件 1.找到6886行 co

    2024年02月15日
    浏览(34)
  • elasticsearch6.1.3查询只返回部分数据或报错Data too large

    1、ES导出报错 CircuitBreakingException[[FIELDDATA] Data too large, data for [proccessDate] would be larger than limit of [10307921510/9.5gb]] 2、ES导出丢失数据,只返回范围内部分数据,同时未报错 ES在查询时,会将索引数据缓存在内存(JVM)中。 当缓存数据到达驱逐线时,会自动驱逐掉部分数据,把缓

    2024年02月06日
    浏览(51)
  • 【问题解决】ElasticSearch分页查询时数据顺序错乱/不一致的问题

    问题描述: 使用ElasticSearch分页查询时,每次输入同样的分页参数以及查询条件,得到的结果不一致的问题。 问题分析: ElasticSearch中索引可能是由多个分片构成的,并且每个分片可能拥有多个副本,其对应的设置时索引建立时的设置。 number_of_shards:索引拥有多少个分片 n

    2024年02月02日
    浏览(56)
  • 问题解决:django模型查询报错,找不到数据库表

    django项目,使用的postgresql数据库,建了多个模式,模型查询时一直默认查public的表 1. 问题 :   django.db.utils.ProgrammingError: relation \\\"ip_management_app.table\\\" does not exist 2. 代码: 3. 解决方案 (1)使用的django2.0,settings文件中修改数据库配置,增加OPTIONS (2)其他方案 修改db_table,有

    2024年01月23日
    浏览(54)
  • 【Mysql】X-DOC:Mysql数据库大量数据查询加速(定时JOB和存储过程应用案例)

    在某中台系统中,设计了大量的基础数据(维度数据、维度映射关系等)来支撑业务功能,业务表中存在大量的维度外键关联字段,其优点是可以实现前端的选择录入,数据校验,确保录入数据的准确性;缺点是在做业务报表时,需要做大量的维度关联(join)操作。 受限于

    2024年02月12日
    浏览(40)
  • SQL Server 数据导出教程:基于查询语句的高效导出方法

    (1)点击左上角可以选择所有要导出的数据。 (2)然后右击,选择【将结果另存为】。 (3)然后选择导出【文件的路径】和导出的【文件格式】。 (4)导出后,然后打开刚刚导出的文件即可查看数据。 (1)选择要导出的数据,在哪个数据库中。 (2)然后右击数据库,

    2024年02月15日
    浏览(43)
  • Elasticsearch 查询全部数据,按照时间区间查询数据

    简介 在项目开发过程中需要从Elasticsearch中查询日志数据,下面介绍从Elasticsearch中查询索引全部数据,以及按照时间区间查询索引数据。 引入依赖 创建配置类 查询索引下的全部数据 按照时间区间查询索引数据

    2024年02月11日
    浏览(52)
  • 万级数据优化EasyExcel+mybatis流式查询导出封装

    时间 更新内容 2023/09/23 fix: 每个sheet大小和存储内存条数一致的bug update: 增大一个sheet的默认容量 我们不妨先给大家讲一个概念,利用此概念我们正好给大家介绍一个数据库优化的小技巧: 需求如下:将一个地市表的数据导出70万条。 如果你不假思索,直接一条sql语句搞上去

    2024年02月11日
    浏览(58)
  • 深入解析MySQL视图、索引、数据导入导出:优化查询和提高效率

    目录 1. 视图(View): 什么是视图? 为什么要使用视图? 视图的优缺点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 示例操作 没使用前 使用后 2. 索引(Index): 什么是索引? 为什么要使用索引?

    2024年02月13日
    浏览(61)
  • 导出Oracle数据库sqlplus命令行查询的结果到文件

    在Oracle数据库sqlplus命令行操作时,如果想将SQL查询出来的结果导出到文件中,可以使用SQLPlus中的 SPOOL 命令来将查询结果导出到文件。 1.开启日志记录:使用SPOOL命令,指定需要输出的文件路径及文件名。例如: SPOOL /存放路径/oracle.txt 2.执行SQL查询语句:你可以输入任何需要

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包