ES 创建太多 buckets 错误: trying to create too many buckets. must be less than or equal to: [100000] but w

这篇具有很好参考价值的文章主要介绍了ES 创建太多 buckets 错误: trying to create too many buckets. must be less than or equal to: [100000] but w。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ES 创建太多 buckets 错误: trying to create too many buckets. must be less than or equal to: [100000] but was [100001].

错误描述:

trying to create too many buckets. must be less than or equal to: [100000] but was [100001]. this limit can be set by changing the [search.max_buckets] cluster level setting.

一般的解决方法 调大 search.max_buckets 的值,在 kibana 中直接执行下列语句:

PUT /_cluster/settings
{
  "persistent": {
    "search.max_buckets": 20000
  }
}

如果你的服务器能撑住,或者自身评估直接扩大并无问题,那么本文的阅读就可以到此为止了


但是我对扩张 search.max_buckets 感到担忧怎么办?

我们跟踪一个例子向下探索解决方案。

显然 es 默认设置 10000 的上限是有原因的,这块需要对你的服务器性能有一个评估,考虑你的 es 服务是否能撑得住这种大量的聚合计算,冒然扩大限制可能导致服务的崩溃。

如果预计的 buckets 数量级别过大,就需要结合具体场景分析在查询层面进行优化。

Tips 最终解决思路请直接移步文末

我这里实际遇到的需求场景是:

目前需要对用户在工作流中的自定义字段进行聚合

需要计算出当前工作流任务中 自定义字段选项的分布情况(仅支持单选、多选、多级选择)。

例如 有个自定义字段是 ”地区“ 其中有选项 ”北京“ ”上海“ ,那么就需要算出 填选了 北京 的任务有多少个 上海 的任务有多少个

ES 创建太多 buckets 错误: trying to create too many buckets. must be less than or equal to: [100000] but w

// 一个最简原型 mapping
{
  "work_flow" : {
    "mappings" : {
      "properties" : {
        "create_time" : {
          "type" : "date"
        },
        "fields" : {
          "type" : "nested",
          "properties" : {
            "field_id" : {
              "type" : "long"
            },
            "field_type" : {
              "type" : "long"
            },
            "field_value" : {
              "type" : "text"
            },
            "field_value_key" : {
              "type" : "keyword"
            }
          }
        },
        "group_id" : {
          "type" : "long"
        },
        "task_id" : {
          "type" : "long"
        }
      }
    }
  }
}

虽然我们需求上限制了 仅支持单选、多选、多级选择,但是自定义字段的 es index 是在一起的,上述需求聚合时免不了要对字段值进行分桶聚合,此时就会将可以开放填写的文本字段也聚合进来,即使这个字段值仅仅只有 1 个任务匹配。当这个工作流中的任务基数足够大的时候就会产生分桶爆炸。

GET /work_flow/_search
{
  "size": 0,
  "timeout": "5s",
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "group_id": 666
          }
        },
        {
          "range": {
            "create_time": {
              "from": 1625068800000,
              "to": 1627487999000
            }
          }
        }
      ]
    }
  },
  "track_total_hits": false,
  "aggregations": {
    "fields": {
      "nested": {
        "path": "fields"
      },
      "aggregations": {
        "fields.field_id": {
          "terms": {
            "field": "fields.field_id",
            "size": 2147483647
          },
          "aggregations": {
            "fields.field_value_key": {
              "terms": {
                "field": "fields.field_value_key",
                "size": 2147483647
              }
            }
          }
        }
      }
    }
  }
}

有一个思路是对字段类型进行过滤后进行聚合,这个思路看似是可行的,但是忽略了一个问题,当前索引是以任务为基本单位存储数据的,自定义字段仅仅是附属值,而一个任务可能多个自定义字段都有值,所以这个过滤可以生效,但是效果并不大。而且如果你存了其他自定义字段的空值,这个过滤就完全没有效果了。但是聊胜于无,在查询时加下空串判断

GET /work_flow/_search
{
  "size": 0,
  "timeout": "5s",
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "create_time": {
              "from": 1635696000000,
              "to": 1638201599000
            }
          }
        }
      ],
      "filter": [
        {
          "term": {
            "group_id": 666
          }
        },
        {
          "nested": {
            "query": {
              "bool": {
                "must": [
                  {
                    "terms": {
                      "fields.field_type": [
                        2,
                        4,
                        5
                      ]
                    }
                  }
                ],
                "must_not": {
                  "term":{
                    "fields.field_value_key":""
                  }
                }
              }
            },
            "path": "fields"
          }
        }
      ]
    }
  },
  "track_total_hits": false,
  "aggregations": {
    "fields": {
      "nested": {
        "path": "fields"
      },
     
      "aggregations": {
        "fields.field_id": {
          "terms": {
            "field": "fields.field_id",
            "size": 2147483647
          },
          "aggregations": {
            "fields.field_value_key": {
              "terms": {
                "field": "fields.field_value_key",
                "size": 2147483647
              }
            }
          }
        }
      }
    }
  }
}

重新整理一下现在的问题

es 首先根据我们的要求找到了目标工作流,并且过滤剩下了只包含了 单选,多选,多级选择 的任务 但是这些任务数据中同时可能包含其他自定义字段 之后 es 进行聚合统计,这里导致 trying to create too many buckets 的原因就是我们虽然进行了过滤,但最终数据不可避免的有无效数据参与了分桶。

基于上述的梳理,我大概有以下几个方案

方案:

  1. 为这类查询单独建立一个索引 (维护代价较大)。
  2. 分页
  3. 调小聚合 size

这里采用 2、3 结合的方式进行处理 聚合 size 考虑给到 200 ,具体可以根据场景进行调整

GET /work_flow/_search
{
  "size": 0,
  "timeout": "5s",
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "create_time": {
              "from": 1635696000000,
              "to": 1638201599000
            }
          }
        }
      ],
      "filter": [
        {
          "term": {
            "group_id": 666
          }
        },
        {
          "nested": {
            "query": {
              "bool": {
                "must": [
                  {
                    "terms": {
                      "fields.field_type": [
                        2,
                        4,
                        5
                      ]
                    }
                  }
                ],
                "must_not": {
                  "term":{
                    "fields.field_value_key":""
                  }
                }
              }
            },
            "path": "fields"
          }
        }
      ]
    }
  },
  "track_total_hits": false,
  "aggregations": {
    "fields": {
      "nested": {
        "path": "fields"
      },
     
      "aggregations": {
        "fields.field_id": {
          "composite": {
            "size": 5,
            "sources": [
              {
                "fields": {
                  "terms": {
                    "field": "fields.field_id"
                  }
                }
              }
            ]
          },
          "aggregations": {
            "fields.field_value_key": {
              "terms": {
                "field": "fields.field_value_key",
                "size": 200
              }
            }
          }
        }
      }
    }
  }
}

这里对 fieldId 进行了分页,加入了 composite

          "composite": {
            "size": 5,
            "sources": [
              {
                "fields": {
                  "terms": {
                    "field": "fields.field_id"
                  }
                }
              }
            ]
          },

返回时会返回 after_key 下次请求时带上

"fields.field_id" : {
        "after_key" : {
          "fields" : 185
}
"fields.field_id": {
          "composite": {
            "size": 1,
            "sources": [
              {
                "fields": {
                  "terms": {
                    "field": "fields.field_id"
                  }
                }
              }
            ],
            "after": {"fields":185}
},

这里 DSL 的思路已经搞定了,那么在 Java 代码层面,只需要进行分页分部查询,最后聚合数据即可。

最终解决思路:文章来源地址https://www.toymoban.com/news/detail-471211.html

  1. 缩小聚合数据范围 (探寻所有可用的限制条件,能限制尽量限制)
  2. 使用 composite 对聚合数据分页 (es 查询分页在代码层面最终聚合结果)
  3. 调整合适的 size 大小 (如果你的聚合项有冗余数据,可以考虑调小结果 size)

到了这里,关于ES 创建太多 buckets 错误: trying to create too many buckets. must be less than or equal to: [100000] but w的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Git error: unable to create file xxx: Filename too long(git克隆代码时出现错误:无法创建文件xxx:文件名太长)

    错误原因: 文件名太长,无法签出工作树警告:克隆成功,但签出失败。 找到需要从git远程下载到本地目录的文件,切入到该文件目录下,输入:

    2024年02月04日
    浏览(47)
  • MySQL出现too many connections错误

    1、现象 navicat连接MySQL时报 too many connections 错误 2、原因 my.ini 中设定的并发连接数太少或者系统繁忙导致连接数被占满。 连接数超过了 MySQL 设置的值,与 max_connections 和 wait_timeout 都有关。 wait_timeout 的值越大,连接的空闲等待就越长,这样就会造成当前连接数越大。 3、解

    2024年02月11日
    浏览(30)
  • ES执行报错:too_many_clause

    问题原因: bool 查询拼接太多了,有一个拼接上限,es默认设置为1024 解决方法:

    2024年02月12日
    浏览(65)
  • ssh 连接错误 Too many authentication failures 解决方法

    有时候使用 ssh 登录 或者 git ssh 方式连接 时会遇到: Too many authentication failures 这个错误的原因是客户端尝试连接次数大于服务端限制的次数。 默认情况下: ssh 客户端会按照认证顺序: 1. 依次尝试 ssh-agent 中的秘钥和配对~/.ssh 的秘钥对 2. 如果都失败了会尝试密码登录 如果

    2024年02月01日
    浏览(25)
  • ValueError:too many values to unpack (expected 2)

    【学习参考】:成功解决ValueError:too many values to unpack (expected 2)_叫我李嘉图的博客-CSDN博客 ValueError: too many values to unpack (expected 3)_归来-依旧-是-少年的博客-CSDN博客 解决思路: (1).首先理解错误类型: ValueError–ValueError:函数或方法虽然接受了正确的【类型】的参数,但是该参数

    2024年02月12日
    浏览(30)
  • 使用 python multiprocessing.Queue 出现 too many open files 错误

    问题描述 使用 python 子进程 multiprocessing.Process 执行任务,并使用 multiprocessing.Queue 回传任务执行结果。程序执行时间长以后,出现 Too many open files 错误。使用 lsof -p 进程号 能看到有很多未关闭的 pipe。后经排查发现大概率是 multiprocessing.Queue的问题,为了验证想法,写了一个测

    2024年02月09日
    浏览(23)
  • 出现OSError: [Errno 24] Too many open files错误解决方法。

    出现了: 这是因为 1,打开文件太多 2,其实不然,是线程限制,通常我们采用更改限制即可。 输入下面的命令看一下:  输出:1024 果然如我所预想,得到的结果是1024,就是说系统限制为同时打开1024个文件。 修改方法: 1、将自己的线程数改小,使之符合这个限制(只是方

    2024年02月16日
    浏览(29)
  • 机器学习报错解决2——ValueError: too many values to unpack (expected 3)

    参考资料:蔚蓝呆鸟 在我学习Pytorch的PIL模块的过程中,运行了如下代码: 大致意思是将一张RGB图片分成R、G、B三个通道,并分别将每个通道的图片保存下来。 但是出现了如下的报错: ValueError: too many values to unpack (expected 3) 翻译一下就是用来接收的变量数与函数需要接收的

    2024年02月02日
    浏览(35)
  • 解决TortoiseGit软件Git Show log时显示Too many files to display的问题

    有时代码提交修改的文件比较多,当查看log时无法显示出来修改的文件列表,如下所示: 将LogTooManyItemsThreshold尽可能配置得大一些。 https://gitlab.com/tortoisegit/tortoisegit/-/issues/3878

    2024年04月12日
    浏览(26)
  • 【OpenCV实现图像:用Python生成图像特效,报错ValueError: too many values to unpack (expected 3)】

    Python是一种功能强大的编程语言,也是图像处理领域中常用的工具之一。通过使用Python的图像处理库(例如Pillow、OpenCV等),开发者可以实现各种各样的图像特效。这些特效包括但不限于:滤镜效果(如黑白、模糊、锐化等)、颜色转换、边缘检测、形状识别、图像合成和增

    2024年02月06日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包