【开源社区】ES 高基数聚合性能调优

介绍

Elasticsearch term聚合 用于创建 给定字段的唯一值对应的存储桶。例如,包含国家名称的字段上的 term 聚合将为中国创建一个存储桶,为巴基斯坦创建一个存储桶,为俄罗斯创建一个存储桶,等等。在一般情况下,term聚合非常快,但在某些特殊情况下,它们可能会很慢。缓慢聚合的一个原因可能是集群配置错误。性能不佳的另一个原因可能是执行term聚合的字段上的高基数值。

在这篇博文中,我将首先简要概述为确保 Elasticsearch 集群的最佳性能应遵循的一般说明。然后是几个部分,这些部分提供了有助于理解term聚合的基本机制的背景材料,包括 (1) 高基数的定义,(2) 刷新间隔的描述,以及 (3)全局序数。接下来,我将展示如何查看构建全局序数对term聚合性能的影响。最后,我将介绍几种提高高基数项聚合性能的技术,包括 (1) 基于时间的索引,(2) 急切的全局序数,以及 (3) 防止 Elasticsearch 构建全局序数的技术。

在一个例子中,这篇博文中记录的技术能够将在一家非常大的零售银行运行的高基数term聚合的执行时间从 15 秒减少到 15 毫秒以下。

一般建议

调整集群会对集群的整体性能产生很大影响。以下 Elasticsearch 文档提供了有关配置和调整 Elasticsearch 集群的详细信息,应遵循:

  • 重要的系统配置
  • 调整搜索速度
  • 调整索引速度
  • 调整磁盘使用情况

基数

term聚合的性能可能会受到正在聚合的字段的基数的极大影响。基数是指存储在特定字段中的值的唯一性。高基数意味着一个字段包含很大比例的唯一值。低基数意味着一个字段包含大量重复值。例如,存储国家名称的字段的基数相对较低,因为世界上只有不到 200 个国家。或者,存储 IBAN 号码或电子邮件地址的字段具有高基数,因为可能存储了数百万个唯一值。

在这篇博文中讨论高基数时,指的是具有数十万或数百万个唯一值的字段。

Elasticsearch 刷新间隔

为了理解这篇博客的其余部分,必须对刷新间隔有一个大致的了解。

当文档被插入到 Elasticsearch 中时,它们会被写入缓冲区,然后定期从该缓冲区刷新到Segments中。这种刷新操作称为刷新,新插入的文档只有在刷新后才能搜索。默认情况下每秒刷新一次,但是刷新间隔是可配置的。

刷新间隔与性能相关,因为在后台,Elasticsearch 将小段合并为更大的段,而那些较大的段则合并为更大的段,依此类推。因此,通过启用频繁刷新,Elasticsearch 需要做更多的后台工作来合并小段,而不是需要做的不太频繁的刷新会创建更大的段。

如果新插入的数据需要近乎实时的搜索功能,则需要频繁刷新,但在其他用例中可能不需要这种频繁刷新。如果应用程序可以等待更长时间以等待最近的数据出现在其搜索结果中,则可以增加刷新间隔以提高数据摄取的效率,从而释放资源以提高整体集群性能。

全局序数

term聚合依靠全局序数来提高效率。全局序数是一种数据结构,它为给定字段的每个唯一term维护一个增量编号。全局序数是在每个分片上计算的,默认情况下,后续term聚合将完全依赖这些全局序数来有效地在分片级别执行聚合。然后将全局序数转换为最终归约阶段的实数,该阶段结合了来自不同分片的结果。如果修改了分片,则需要为该分片计算新的全局序数。

高基数字段上的term聚合的性能可能很慢且不可预测,部分原因是(1)构建全局序数所花费的时间将随着字段基数的增加而增加,以及(2)默认情况下,全局序数是惰性的建立在自上次刷新以来发生的第一个聚合之上。此外,频繁的文档插入、频繁的刷新和频繁执行的term聚合的组合将导致频繁地重新计算全局序数。

可以在此 GitHub 问题中找到有关全局序数性能的更多详细信息。

如何查看全局序数对term聚合的影响

Elasticsearch 日志文件对于检测性能问题非常有帮助。将日志级别设置为适当的值,记住过多的日志记录可能会增加磁盘 IO 并对性能产生负面影响。监视名为elasticsearch_index_search_slowlog.log. 如果slowlog文件中出现slow term aggregations,那么它们的性能不佳可能是由于全局序数的构建,可以检查如下:

继续向 Elasticsearch 中插入数据,以确保在我们执行term聚合时重建全局序数。从慢日志文件中复制慢项聚合并手动执行和分析它,以了解执行时间花费在哪里。

继续将数据插入 Elasticsearch。从慢日志文件中复制term聚合并手动执行它。在执行 terms 聚合时,同时执行hot_threads api。如果热线程通常返回包含对 的引用的结果GlobalOrdinalsBuilder,那么代码可能会花费大量时间来构建全局序数。

通过执行以下命令 临时启用全局序号信息的记录:

PUT _cluster/settings
{"transient": {"logger.org.elasticsearch.index.fielddata": "TRACE"}
}

这会将有关构建全局序号所花费的时间的信息写入elasticsearch.log文件,例如:

global-ordinals [<field_name>][1014089] took [592.3ms]

完成上述操作后,请务必将日志记录设置回默认值,因为将日志记录设置为 时可能会影响性能TRACE。

给定字段的全局序数数据结构的大小可以通过memory_size_in_bytes在执行indices stats命令时查看,如下所示:

GET <index_name>/_stats/fielddata?fielddata_fields=<字段名>

如果构建全局序数会消耗大量资源,上述命令应该会给出一个想法。本文的其余部分重点介绍减轻构建全局序数对term聚合的影响的步骤。

使用基于时间的索引

如果该分片自上次计算其全局序数以来已被修改,则仅需要在该分片上重新创建全局序数。如果自上次计算其全局序数以来未修改分片,则将继续使用先前计算的全局序数。对于时间序列数据,实施基于时间的索引是确保大多数索引/分片保持不变的好方法,这将减少刷新操作后需要重新计算的全局序数的大小。

例如,如果两年的数据存储在月度索引而不是一个大型索引中,则每个月度索引的大小是一个大型索引的 1/24。由于我们正在考虑时间序列数据,我们知道只有最近的月度索引才会插入新文档。这意味着只有 24 个索引中的一个被主动写入。由于全局序数仅在已修改的分片上重建,因此 24 个月度索引中的 23 个分片将继续使用先前计算的全局序数。与将两年的数据存储在一个大型索引中相比,这将把构建全局序数所需的工作减少多达 24 倍。

启用急切的全局序数

高基数项聚合的性能可以通过 急切地构建全局序数来提高。启用全局序数的急切构建将在刷新段时创建全局序数数据结构,而不是每次刷新后的第一个查询。但是,权衡是急切地构建全局序号可能会对摄取性能产生负面影响,因为每次刷新都会计算新的全局序号,即使它们可能不被使用。为了尽量减少由于频繁刷新而频繁构建全局序数所带来的额外工作量,应该增加刷新间隔。

不要建立全局序数

另一种提高高基数term聚合性能的方法是完全避免构建全局序数,而是直接在原始term上执行term聚合。这可能是有益的,因为在高基数域上计算全局序数可能会很慢,并且不构建全局序数将消除这种延迟。这是以降低每个后续term聚合的效率为代价的,因为它们不能利用全局序数。

此外,请注意,如果没有为term聚合构建全局序号,则term聚合将在每个请求中使用更多内存,因为 Elasticsearch 需要保留结果集中出现的所有唯一term的映射。如果要聚合大量唯一term,这可能会触发内部断路器以防止内存过度使用,这可能导致聚合失败。

因此,只有在预计term聚合将在相对较少数量的文档上执行时,才应应用此方法。例如,如果聚合与 在filter context 中 执行 的选择性bool 查询一起定义,则可能会出现这种情况。使用真实数据运行实验,以确定这种方法是否可以提高特定用例的性能。

在 Elasticsearch 6.7 或更高版本中,这可以通过指定"execution_hint": "map"来完成,它告诉 Elasticsearch 直接聚合字段值而不利用全局序数,或者在旧版本中,这可以通过使用在term聚合,如下所述。

默认情况下,term聚合将返回按每个存储桶中的文档数量排序的前十个term的存储桶。以下是顶级 IBAN 标识符的示例term聚合。默认情况下,此term聚合将在最后一次刷新后的第一次执行时重建全局序数。

"aggregations": {"top-ibans": {"terms": {"field": "IBAN_keyword"}}
}

这可以重写以避免在 Elasticsearch 6.7 或更高版本中使用全局序号,如下所示。

"aggregations": {"top-ibans": {"terms": {"field": "IBAN_keyword","execution_hint": "map"}}
}

在 6.7 之前的 Elasticsearch 版本中,有一个错误会导致计算全局序数,即使"execution_hint": "map"已指定。这已在此 github pull request中修复。对于旧版本,可以应用以下技术来防止为上述 term 聚合构建全局序数。

"aggregations" : {"top-ibans" : {"terms" : {"script": {"source" : "doc['IBAN_keyword'].value","lang" : "painless"}}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux之sed命令详解

文章目录 &#x1f34a;自我介绍&#x1f34a;sed概述&#x1f34a;sed语法讲解格式&#xff1a;options 命令选项{commmand}[flags] &#x1f34a;场景训练 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff…

用ChatGPT完成高质量文献综述全过程实操指南,用高级学术版专业应用gpts轻松搞定

文献综述在学术研究中占据核心地位,不仅为研究提供坚实的理论基础,也是创新观点和理论框架构建的重要支柱。然而,撰写高质量的文献综述往往是一项复杂且繁重的工作,需要研究者对领域内的文献进行广泛筛选、分类、对比和整合。该过程不仅考验研究者的分析能力,还要求对文献…

Java题目笔记(十四)Date +综合练习

一、时间计算时间比较 import java.util.Date; import java.util.Random;public class Main {public static void main(String[] args) {//需求1Date d1new Date(0L); //从时间原点开始经过了0毫秒long timed1.getTime();timetime1000L*60*60*24*365; //一年的时间d1.setTime(…

【C++练习】计算应发利润总数

题目&#xff1a;计算应发利润总数 问题描述&#xff1a; 某公司根据销售额 x&#xff08;单位&#xff1a;元&#xff09;计算应发利润总数 y&#xff08;单位&#xff1a;元&#xff09;&#xff0c;具体计算规则如下&#xff1a; 如果销售额 x 小于等于 100,000 元&#…

Permissions 0755 for ‘/etc/ssh/ssh_host_rsa_key‘ are too open.问题解决

1、问题背景 代码上库公司git后,将项目上出的程序烧录到设备中,wifi能够正常链接&#xff0c;但是通过wifi链接 ssh登录设备失败。把调试串口引出,查看linux启动log,发现如下打印信息&#xff1a; WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions 075…

企业网络架构基础

1.网络宇宙 似宇宙洪荒&#xff0c;浩瀚无边&#xff0c;深不可测&#xff1b;网络案例似璀璨群星&#xff0c;千变万化&#xff0c;闪耀环宇。学习网络技术似夜观星象&#xff0c;每有所得&#xff0c;便拍案惊奇&#xff0c;夜不能寐 2.企业网络 企业网络已经广泛应用在各行…

Vue 3 的 全局状态管理

1.思路梳理 工厂仓拣货信息&#xff1a;Factory Picking Info (FPI)工厂仓调度信息&#xff1a;Factory Scheduling Info (FSI)DC 收货信息&#xff1a;DC Receiving Info (DCRI)上架信息&#xff1a;Shelving Info (SI)盘点信息&#xff1a;Inventory Count Info (ICI)移位信…

基于Spring Boot的在线装修管理系统的设计与实现,LW+源码+讲解

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

神经网络基础--什么是正向传播??什么是方向传播??

前言 本专栏更新神经网络的一些基础知识&#xff1b;这个是本人初学神经网络做的笔记&#xff0c;仅仅堆正向传播、方向传播就行了了一个讲解&#xff0c;更加系统的讲解&#xff0c;本人后面会更新《李沐动手学习深度学习》&#xff0c;会更有详细讲解;案例代码基于pytorch&a…

移动电源充气泵SIC8833应用方案设计

电动充气泵方案基于简单原理&#xff0c;使用时能自动检测轮胎压力。当胎压低于预设值时&#xff0c;电机自动启动&#xff0c;将压缩气体经进气管泵入轮胎。一旦充气泵达到设定的胎压上限&#xff0c;电机将自动关闭。该方案由压力传感器、ADC芯片、主控芯片等核心组件构成。其…

IP Source Guard

一、什么是IP Source Guard IP Source Guard&#xff08;IPSG&#xff09;是一种基于 IP/MAC 的端口流量过滤技术&#xff0c;用于防止局域网内的 IP 地址欺骗攻击。 隔绝非法DHCP服务器&#xff1a;通过配置非信任端口&#xff0c;IPSG可以有效阻止非法DHCP服务器向网络中的…

赛元MCU 脱机烧录步骤

烧录设置 生成烧录配置文件 载入配置文件 下载程序到烧录器中 并 对比 脱机烧录 1、 将SC-LINK 使用外部5V电源供电 2、将烧录口对准主板烧录接口 3、busy亮红灯&#xff0c;进入烧录ing&#xff0c;烧录成功后&#xff0c;OK灯亮蓝灯 注意事项 其中工程校验和 可以作为程序…

数字信号处理Python示例(8)使用复数指数函数生成正弦函数和余弦函数

文章目录 前言一、相量叠加原理二、使用旋转相量生成余弦和正弦波的Python代码三、仿真结果及分析写在后面的话 前言 首先给出使用复数指数函数生成正弦函数和余弦函数的数学表达式&#xff0c;然后给出Python仿真代码&#xff0c;并绘制了生成的函数图形&#xff0c;最后给出…

Pr 视频过渡:沉浸式视频 - VR 球形模糊

效果面板/视频过渡/沉浸式视频/VR 球形模糊 Video Transitions/Immersive Video/VR Spherical Blur VR 球形模糊 VR Spherical Blur用于 VR 视频中的模糊式场景切换&#xff0c;模糊效果以球形方式呈现&#xff0c;使画面逐渐模糊或清晰。 自动 VR 属性 Auto VR Properties 默…

智启未来,趣享生活 德国卡赫举办系列新品首发活动

全球最大的清洁设备和清洁解决方案提供商德国卡赫&#xff0c;于11月6日在第七届进博会新品发布平台举办主题为“智启未来&#xff0c;趣享生活”的新品发布会&#xff0c;揭开全球首发新品可折叠式手持清洗机KHB Air以及亚洲首发新品商用清洁机器人KIRA CV 50的神秘面纱。作为…

在Scrapy爬虫中应用Crawlera进行反爬虫策略

在互联网时代&#xff0c;数据成为了企业竞争的关键资源。然而&#xff0c;许多网站为了保护自身数据&#xff0c;会采取各种反爬虫技术来阻止爬虫的访问。Scrapy作为一个强大的爬虫框架&#xff0c;虽然能够高效地抓取网页数据&#xff0c;但在面对复杂的反爬虫机制时&#xf…

【基于PSINS工具箱】以速度为观测量的SINS/GNSS组合导航,UKF滤波

基于【PSINS工具箱】&#xff0c;提供一个MATLAB例程&#xff0c;仅以速度为观测量的SINS/GNSS组合导航&#xff08;滤波方式为UKF&#xff09; 文章目录 工具箱程序简述运行结果 代码程序讲解MATLAB 代码教程&#xff1a;使用UKF进行速度观测1. 引言与基本设置2. 初始设置3. U…

【深度学习滑坡制图|论文解读2】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法

【深度学习滑坡制图|论文解读2】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法 【深度学习滑坡制图|论文解读2】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法 文章目录 【深度学习滑坡制图|论文解读2】基于融合CNN-Transformer网络和…

二次封装 el-pagination 组件存在的问题

在使用 Element Plus 组件时&#xff0c;有时会遇到组件不完全符合需求的情况&#xff0c;这时可能需要对其进行二次封装。在封装 Pagination 组件时&#xff0c;我们会发现一些属性和函数无法正常使用&#xff0c;下面将详细探讨这些问题&#xff0c;并提供一下思路和想法。 …

Elasticsearch-linux环境部署

本文主要介绍linux下elasticsearch的部署。通过在一台linux服务器中分别对elasticsearch-6.7.2版本&#xff0c;elasticsearch-7.3.0版本来进行安装&#xff0c;记录在安装elasticsearch-7.3.0版本时出现的异常情况&#xff0c;以及elasticsearch-head的安装。 基础环境 本机已…