Query failed with error code 96 and error message 'Executor error during find command: OperationFail

Query failed with error code 96 and error message 'Executor error during find command: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.' on server

刚开始还以为是查询得到的内容比较大,所以 指定字段 指定查询返回的字段,我用的是 Spring data mongo 的 query()


大致方法如下

 Query query = Query.query(new Criteria());
 PageRequest pageRequest=new PageRequest(pageNumber - 1, pageSize);
 query.addCriteria(Criteria.where("fillStatus").gte(10));
 query.skip(pageRequest.getOffset()).limit(pageSize).with(new Sort(Sort.Direction.DESC, "createTime"));
 long totalCount=this.mongoDao.count(query,HealthQues.class);
 int totalPage=0;
 if(totalCount%pageSize==0){
     totalPage=Integer.parseInt(totalCount/pageSize+"");
 }else{
     totalPage=Integer.parseInt(totalCount/pageSize+"")+1;
 }
//指定返回字段
query.fields().include("id");
query.fields().include("memberId");
等等、、、这里指定一个就返回一个,指定俩个就返回两个

List<HealthQues> healthQuesList=this.mongoDao.find(query,HealthQues.class);//程序运行到这里报错!!!!

结果查询到仍然报错,

原因比较明确:Sort operation used more than the maximum 33554432 bytes of RAM.33554432 bytes算下来正好是32Mb,而mongodbsort操作是把数据拿到内存中再进行排序的,为了节约内存,默认给sort操作限制了最大内存为32Mb,当数据量越来越大直到超过32Mb的时候就自然抛出异常了!解决方案有两个思路,一个是既然内存不够用那就修改默认配置多分配点内存空间;一个是像错误提示里面说的那样创建索引。
首先说如何修改默认内存配置,在Mongodb命令行窗口中执行如下命令即可:

db.adminCommand({setParameter:1, internalQueryExecMaxBlockingSortBytes:335544320}) //不推荐使用
 
 
  • 1
  • 1

我直接把内存扩大了10倍,变成了320Mb。从这里可以看出,除非你服务器的内存足够大,否则sort占用的内存会成为一个严重的资源消耗!然后是创建索引,也比较简单:

db.yourCollection.createIndex({<field>:<1 or -1>})  //只执行这句就能解决bug  注意不能直接复制粘贴,要根据集合编写语句。
db.yourCollection.getIndexes()  //查看当前collection的索引
 
 
  • 1
  • 2
  • 1
  • 2

其中1表示升序排列,-1表示降序排列。索引创建之后即时生效,不需要重启数据库和服务器程序,也不需要对原来的数据库查询语句进行修改。创建索引的话也有不好的地方,会导致数据写入变慢,同时Mongodb数据本身占用的存储空间也会变多。不过从查询性能和服务器资源消耗这两方面来看,通过创建索引来解决这个问题还是最佳的方案!



  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
这个错误通常是因为Executor在执行Task的过程中发生了异常,可以根据具体的错误信息进行排查。常见的排查方法如下: 1. 查看错误日志:在错误日志中通常会有详细的错误信息,可以从中找到具体的错误原因。可以在Spark的Web UI中查看错误日志,或者在Driver程序中设置log4j日志输出级别为DEBUG,以便查看更详细的日志信息。 2. 检查代码逻辑:如果错误日志中没有明确的错误信息,可以检查代码逻辑是否存在问题,例如是否有空指针异常、数组越界异常、类型转换异常等。可以使用IDE工具进行调试,或者在代码中增加日志输出,以便快速定位问题。 3. 检查资源配置:如果Executor在执行Task的过程中发生了OOM(out of memory)错误,可以检查集群的资源配置是否足够,例如Executor的内存分配是否合理、Executor的个数是否过多等。 4. 检查网络连接:如果Executor在执行Task的过程中需要访问网络资源,例如HDFS、MySQL等,需要检查网络连接是否稳定,以及网络带宽是否足够。 5. 检查版本兼容性:如果使用的Spark版本与其他组件(例如Hadoop、Hive等)存在版本不兼容的情况,也可能会导致Executor执行Task时出现异常。 针对以上排查方法,可以根据具体的情况灵活应用。如果问题比较复杂,可以考虑向Spark社区寻求帮助,或者请Spark专业人员提供技术支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值