ES通过抽样agg聚合性能提升3-5倍

        一直以来,es的agg聚合分析性能都比较差(对应sql的 group by)。特别是在超多数据中做聚合,在搜索的条件命中特别多结果的情况下,聚合分析会非常非常的慢。
        一个聚合条件:聚合分析请求的时间 = search time + agg time
        N个聚合条件:聚合分析请求的时间 = search time + agg time * N
        
        搜索的数据范围越大,聚合请求时间越长。
        搜索条件命中的数据越多,聚合请求的时间越长。
        搜索的字段,不一样的值越多,聚合请求时间越长。例如性别字段,通常仅有3个取值(男、女、未知),这种属于取值少的。像邮箱字段,值非常多,上亿个。这种就属于高基数字段。同样的搜索条件,高基数字段的聚合耗时会多非常多!
        聚合请求时候非常吃cpu 和io资源的。通常在大数据检索场景下,很难支持高并发的聚合。并发上去以后,先是CPU飙升,再是IO飙升,随之load很高很高。其根本原因,从agg聚合的源码来看。因为聚合请求分为两个阶段,先根据条件查询数据。然后将命中的全部数据,放在内存中做计算。在第二个过程中,因为将所有命中的数据全部取回来,然后做计算,就涉及到了非常多的小文件的IO。IO会蹭蹭蹭的飙升。
        就目前而言,在不改源码的情况下,聚合性能很难有很大的突破。本篇文章,通过抽样的思路,通过抽取分片,相当于数据剪枝的方式,来节省资源消耗。提升聚合分析性能,提升大概在3-5倍。随着数据越多,分片越多,资源越少,性能提升效果越明显。
        我个人是做万亿级内容数据检索的。负责搜索集群,负责搜索优化。聚合分析性能优化,我应该说已经看了全网关于优化的文章。在实际数据体量非常大的前提下,实际效果不是太明显。
        其中比较好的有这几篇文章。
es官方博文
Improving the performance of high-cardinality terms aggregations in Elasticsearch | Elastic Blog
Elasticsearch 聚合性能优化六大猛招-腾讯云开发者社区-腾讯云
Elasticsearch聚合优化 | 聚合速度提升5倍_es聚合速度-CSDN博客

抽样聚合方案

1.es原生抽样聚合

官方提供的采样聚合

参考文档:Sampler aggregation | Elasticsearch Guide [7.11] | Elastic

        ES中的抽样聚合,意思是只对高质量的数据做聚合。比如,指定搜索条件,该搜索条件命中的数据为100W,对这100W数据,根据相关性分数排序。然后对这topK的数据做聚,比如每个shard上取200条评分最高的数据,去聚合。这就是ES sampler aggregation的含义。

2.es pre-filter机制

参考文档:Elasticsearch的search之_shards skipped之谜_布道的博客-CSDN博客__shards skipped

3.es在检索过程中指定分片

GET index_name/_search?preference=_shards:0

        抽样抽分片的思路,只每次固定只检测其中一个分片。例如我们的索引一共300G,每个分片30G,一共有10个分片。在检索的过程中,只对其中一个分片做检索和聚合。其最终的聚合结果,根据我们的测试来看,效果还是非常不错的。聚合结果的分布情况和本来的terms聚合相差不大。性能也能提升个几倍。注意这种方式,聚合结果是近似的,并不是完全准确的(ES本身的聚合解结果就不是100%精准的)。

        在大数据随机分布的情况下。在搜索命中大量数据情况下,其结果分布也是满足正态分布的。注意在搜索结果命中的结果集越多,其结果越符合正态分布,其聚合结果越接近标准值(原生terms聚合)。这里有一个值,一个经验值,在搜索提交条件命中大于10000的时候,可以用抽样,结果偏差不大。

        注意,这里具体抽哪一个分片是有说法的。我们要考虑一个问题,同一个搜索条件,聚合结果应该是一致的。这里可以将搜索条件进行md5,然后取hash值,然后将hash值模上分片总数。这里只是一个思路。

ES官方的抽样聚合说明

抽样方案对比测试

对比测试了三种聚合分析的方式,其中包含了termssampler terms、和shard抽样(假如有10个shard,只对其中一个shard做搜索)

先说测试结论

官方的抽样,召回的结果和标准结果偏差较大。

官方的抽样,时间花费上,并没有太大的提升。

抽取分片,召回的结果和标准结果偏差不大。

抽取分片,时间花费上,性能提升3-5倍。资源花费为分片总数分之一。

响应时间对比如下

检索范围

检索条件

查询语法

响应时间

备注

major_index_202303

北京 AND 暴雨

terms

4561

7694

shard抽样

1423

2785

效果最好

terms sampler

5650

3663

效果没有太明显

召回结果对比如下

关键词

terms(结果)

抽取一个分片

sampler terms(抽样200)

备注

地区

4224

446

2094

中国

3772

375

-

发展

3605

342

-

天气

3503

378

1942

部分

2781

294

1525

大雨

2395

236

-

暴雨

2394

264

2454

气温

2079

212

915

局地

1851

199

1055

工作

1741

187

-

降雨

-

-

1111

北京

-

-

827

巴西

-

-

801

灾害

-

-

801

检索语句

 这里使用的是query_string 检索语法。对比标准的terms聚合,官方的simple抽样,和抽分片。

  "query": {
    "query_string": {
      "query": """北京 AND 暴雨""",
      "fields": [
        "content^1.0",
        "title^1.0"
      ],
      "type": "phrase",
      "tie_breaker": 1,
      "default_operator": "and",
      "max_determinized_states": 10000,
      "enable_position_increments": true,
      "fuzziness": "AUTO",
      "fuzzy_prefix_length": 0,
      "fuzzy_max_expansions": 50,
      "phrase_slop": 0,
      "escape": false,
      "auto_generate_synonyms_phrase_query": true,
      "fuzzy_transpositions": true,
      "boost": 1
    }
  }

全部测试结果原始数据

搜索范围

搜索条件

聚合方式

耗时情况ms

返回结果 

major_info_202303

北京 AND 暴雨

terms

4561

7694

[

        {

          "key" : "地区",

          "doc_count" : 4224

        },

        {

          "key" : "中国",

          "doc_count" : 3772

        },

        {

          "key" : "发展",

          "doc_count" : 3605

        },

        {

          "key" : "天气",

          "doc_count" : 3503

        },

        {

          "key" : "部分",

          "doc_count" : 2781

        },

        {

          "key" : "大雨",

          "doc_count" : 2395

        },

        {

          "key" : "暴雨",

          "doc_count" : 2394

        },

        {

          "key" : "气温",

          "doc_count" : 2079

        },

        {

          "key" : "局地",

          "doc_count" : 1851

        },

        {

          "key" : "工作",

          "doc_count" : 1741

        }

      ]

terms

sampler

5650

3663

[

          {

            "key" : "暴雨",

            "doc_count" : 2454

          },

          {

            "key" : "地区",

            "doc_count" : 2094

          },

          {

            "key" : "天气",

            "doc_count" : 1942

          },

          {

            "key" : "部分",

            "doc_count" : 1525

          },

          {

            "key" : "降雨",

            "doc_count" : 1111

          },

          {

            "key" : "局地",

            "doc_count" : 1055

          },

          {

            "key" : "气温",

            "doc_count" : 915

          },

          {

            "key" : "北京",

            "doc_count" : 827

          },

          {

            "key" : "巴西",

            "doc_count" : 801

          },

          {

            "key" : "灾害",

            "doc_count" : 801

          }

        ]

terms

+

指定shard

1423

2785

[

        {

          "key" : "地区",

          "doc_count" : 446

        },

        {

          "key" : "天气",

          "doc_count" : 378

        },

        {

          "key" : "中国",

          "doc_count" : 375

        },

        {

          "key" : "发展",

          "doc_count" : 342

        },

        {

          "key" : "部分",

          "doc_count" : 294

        },

        {

          "key" : "暴雨",

          "doc_count" : 264

        },

        {

          "key" : "大雨",

          "doc_count" : 236

        },

        {

          "key" : "气温",

          "doc_count" : 212

        },

        {

          "key" : "局地",

          "doc_count" : 199

        },

        {

          "key" : "工作",

          "doc_count" : 187

        }

      ]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/210433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法】Rabin-Karp 算法

目录 1.概述2.代码实现3.应用 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 有关字符串模式匹配的其它算法: 【算法】Brute-Force 算法 【算法】KMP 算法 1.概述 (1)Rabin-Karp 算法是由 Richard M. Karp 和 Michael O. R…

免费采集工具推荐,好文章值得收藏

采集工具的作用 在互联网的海洋中,有许多强大的免费采集工具,它们为用户提供了便捷、高效的方式,帮助用户从各种网站中收集、整理所需的信息。这些工具不仅广泛应用于市场研究、竞争情报等商业领域,同时也服务于学术研究、个人兴…

虚函数表和虚函数在内存中的位置

文章目录 结论验证 结论 虚函数表指针是虚函数表所在位置的地址。虚函数表指针属于对象实例。因而通过new出来的对象的虚函数表指针位于堆,声名对象的虚函数表指针位于栈 虚函数表位于只读数据段(.rodata),即:C内存模…

量子测量-技术点杂录

目录: 高质量文章导航-持续更新中_GZVIMMY的博客-CSDN博客 前置:量子测量设备 电子显微镜:电子显微镜可以在非常高分辨率下观察生物组织、细胞和分子结构。通过调整电子束的强度和聚焦来观察细胞内部的微小结构。但是,电子显微镜需要对样品进行切片处理,而且在真空中进行…

配置中心--Spring Cloud Config

目录 概述 环境说明 步骤 创建远端git仓库 准备配置文件 配置中心--服务端 配置中心--客户端 配置中心的高可用 配置中心--服务端 配置中心--客户端 消息总线刷新配置 配置中心--服务端 配置中心--客户端 概述 因为微服务架构有很多个服务,手动一个一…

Xilinx FPGA平台DDR3设计详解(二):DDR SDRAM组成与工作过程

本文主要介绍一下DDR SDRAM的基本组成以及工作过程,方便大家更好的理解和掌握DDR的控制与读写。 一、DDR SDRAM的基本组成 1、SDRAM的基本单元 SDRAM的基本单元是一个CMOS晶体管和一个电容组成的电路。 晶体管最上面的一端,称作栅极,通过…

css实现简单的抽奖动画效果和旋转效果,还有春联效果

使用css的animation和transform和transition可以实现简单的图片放大缩小,旋转,位移的效果,由此可以延伸的动画效果还是挺多的,比如图片慢慢放大,图片慢慢旋转并放大,图片慢慢变化位置等等, 抽奖…

mall电商项目(学习记录2)

运行mall-admin Java项目 需要安装Redis,需要安装mysql,同时需要运行其项目提供的mall.sql 运行mall-admin后端程序 安装完Redis、mysql、HeidiSQL(用于执行mall.sql,界面化操作高效直观)、IntelliJ IDEA 运行mall-…

《算法通关村——原来滑动窗口如此简单》

《算法通关村——原来滑动窗口如此简单》 基本思想 滑动窗口的思想非常简单,如下图所示,假如窗口的大小是3,当不断有新数据来时,我们会维护一个大小为3的一个区间,超过3的就将新的放入老的移走。 这个过程有点像火车…

如何开发互联网医院系统源码?互联网医院小程序开发全流程解析

互联网医院系统源码的开发以及互联网医院小程序的设计是关键环节,本文将为您详细解析开发全流程。 一、需求分析与规划 第一步,明确系统的功能模块。同时,规划系统的整体架构、技术栈,在这里需要想到系统的可扩展性和性能。 二…

千梦网创:熟悉抖音内容创作的切入方式

因为身边抖音网红的资源比较近,所以虽然一直没有露脸去做短视频运营,但是最近也是跟随朋友一起开始了短视频的学习之路。 在参观过一些“超级直播间”之后,我们敲定了未来的两个盈利方向,这两个方向可以将我们身边的资源极致利用…

xxl-job 分布式任务调度框架

文章目录 分布式任务调度XXL-Job 简介XXL-Job 环境搭建XXL-Job (源码说明)配置部署调度中心docker安装 Bean模式任务(方法形式)-入门案例任务详解任务详解-执行器任务详解-基础配置任务详解-调度配置任务详解-基础配置任务详解-阻塞处理策略任务详解-路由策略 路由策略路由策略…

网络和Linux网络_8(传输层)TCP协议_续(流量控制+滑动窗口+拥塞控制+紧急指针+listen第二个参数)

目录 1. 流量控制 2. 滑动窗口 2.1 滑动窗口概念 2.2 滑动窗口模型详解 高速重发控制(快重传) 3. 拥塞控制和拥塞窗口 4. 延迟应答 5. 捎带应答 6. 面向字节流 7. 粘包问题 8. 16位紧急指针 9. listen的第二个参数 10. TCP总结异常情况与UD…

【上海大学数字逻辑实验报告】三、组合电路(二)

一、实验目的 掌握8421码到余3码的转换。掌握2421码到格雷码的转换。进一步熟悉组合电路的分析和设计方法。学会使用Quartus II设计8421码到余3码的转换电路逻辑图。学会使用Quartus II设计2421码到格雷码的转换电路逻辑图。 二、实验原理 8421码是最常用的BCD码&#xff0c…

权限的树形列表展示——基于APEX FancyTree Select

select distinct (o.PERMISSION_ID) as id, --数据ido.PARENT_PERMISSION_ID as PARENT_ID, --父ido.PERMISSION_NAME as title, --显示的标题o.PERMISSION_ID as VALUE, --标题对应的值1 as TYPE,casewhen (select cou…

图解系列--功能追加协议,构建Web内容

功能追加协议 1.消除 HTTP 瓶颈的 SPDY 1.1.HTTP 的瓶颈 使用 HTTP 协议探知服务器上是否有内容更新,就必须频繁地从客户端到服务器端进行确认。如果服务器上没有内容更新,那么就会产生徒劳的通信。 若想在现有 Web 实现所需的功能,以下这些…

国产Type-C接口逻辑协议芯片:Type-C显示器芯片方案

产品介绍 双Type-C盲插选型: LDR6282 PD3.0认证协议芯片,USB-IF TID号:212 支持iic,USB转UART,CC升级方式,多年市场验证,显示器市场出货量,显示器大厂采用兼容性NO.1。采用QFN32 5…

【全栈开发】使用NestJS、Angular和Prisma 打造全栈Typescript开发

在开发Angular应用程序时,我非常喜欢Typescript。使用NestJS,您可以以与Angular非常相似的方式编写后端。 我偶然发现了这个库,发现它非常有趣,所以我想设置一个简单的测试项目。一般来说,我主要使用SQL数据库&#x…

嵌入式 C 语言中的全局变量问题

大家好,今天分享一篇关于嵌入式C编程中全局变量问题的文章。希望对大家有所启发。 嵌入式特别是单片机os-less的程序,最易范的错误是全局变量满天飞。 这个现象在早期汇编转型过来的程序员以及初学者中常见,这帮家伙几乎把全局变量当作函数形…

Spring Data Redis切换底层Jedis 和 Lettuce实现

1 简介 Spring Data Redis是 Spring Data 系列的一部分,它提供了Spring应用程序对Redis的轻松配置和使用。它不仅提供了对Redis操作的高级抽象,还支持Jedis和Lettuce两种连接方式。 可通过简单的配置就能连接Redis,并且可以切换Jedis和Lett…