译文:我们如何使 Elasticsearch 7.11 中的 date_histogram 聚合比以往更快
这篇文章是ES7.11版本的文章,主要学习的是思路,记录在这里留作以后参考用。
原文地址:https://www.elastic.co/cn/blog/how-we-made-date-histogram-aggregations-faster-than-ever-in-elasticsearch-7-11
正文开始:
Elasticsearch 的 date_histogram 聚合是 Kibana 的 Discover 和 Logs Monitoring UI 的基石。我经常使用它来调查构建失败的趋势,但当它运行缓慢时,我会感到不高兴。用了整整四秒钟才绘制出过去六个月某个测试的所有失败情况!我可没有那么多时间!谁能把我的四秒钟还给我?所以在过去的六个月里,我一直在努力提升它的性能。断断续续地。
手动进行舍入
在很久之前(2018年),有一个 bug,名为“time_zone 选项会使 date_histogram 聚合变得慢”。那些涉及夏令时转换的时区会慢四倍。@jpountz 通过在不包含夏令时转换的分片上解释时间并忽略夏令时来修复了它。这很好,因为没有夏令时转换的时区很容易处理!你只需从 UTC 减去它们的偏移量,四舍五入,再加上偏移量,然后进行聚合。嗯,你不亲自操作,是 CPU 来执行的,但问题或情况仍会存在,你能理解吧。
所以 date_histogram 聚合速度很快。但每隔六个月它就会变慢!通常在索引中有大约一天的数据是相当常见的。如果你必须在带有夏令时转换的索引之一上运行 date_histogram,速度会很慢。在我知道这个问题之时,日期舍入本身比具有夏令时转换的分片要慢大约1400%。
原来,我们使用的是 java.util.time APIs,它们非常可爱、精确,并涵盖了所有内容,但它们会分配对象。而你确实希望避免为聚合中的每个数值创建新对象。所以我们摘下了手套,为自己实现了一套特定于日期舍入方式的夏令时转换代码。现在,我们不再分配对象,而是可以构建一个包含分片可见的所有夏令时转换的数组,然后进行二进制搜索。这很快!即使分片有成千上万个转换。对数时间真是一件美妙的事情。
停止舍入
但是,如果你要在分片上预先计算所有数据的夏令时转换,为什么不预先计算所有的“舍入点”呢?也就是 date_histogram 可能生成的每个存储桶的所有键。在我们实现“去除限制”的舍入 API 时,我们进行了所有工作,将索引中的最小日期和最大日期流式传输到所有正确的位置,因此你可以从最小日期开始,然后获取下一个舍入值,直到超出最大日期,将其添加到一个数组中并进行二进制搜索。然后你根本不需要再调用日期舍入代码。这种方法总是更快的。嗯,几乎总是。只有当你有很长时间范围内的一小组文档时,才不适用。但即使在这种情况下,它也很快。再次强调,对数时间是一种奇妙的东西。
开始过滤
稍微偏题一下:@polyfractal 提出了一个想法,通过查看搜索索引而不是文档值,可以加速范围聚合。这显示出了相当引人注目的速度提升,但我们不想合并这个原型,因为维护成本较高,而且人们并不经常使用范围聚合。
但我们意识到,如果你已经预先计算了 date_histogram 的所有“舍入点”,你可以将其转换为范围聚合。如果你像 @polyfractal 的原型一样,为该范围聚合使用搜索索引,你将获得8倍的速度提升。现在,正在维护范围聚合的优化,因为它正在为日期直方图聚合提供优化支持。
这是我们第一次将一个聚合转换为另一个聚合,以更高效地执行它。实际上,我们执行了两次。我们将 date_histogram 转换为范围聚合,然后将范围聚合转换为过滤聚合。过滤聚合从来没有非常快。因此,我们为其编写了“按过滤器过滤”的执行模式,以在某些情况下生成正确的结果,并在其他情况下不使用它。因此,事件的顺序如下:

这个方法的巧妙之处在于你可以在沿途的任何站点上加入“optimization train - 优化列车”。范围聚合将检查它们是否可以运行“filter by filter - 按过滤器过滤”。过滤聚合也会这样检查。
它没有范围特定优化所带来的维护负担,因为我们只需要维护新的“filter by filter - 按过滤器过滤”执行机制和聚合重写。而且我们可能可以通过其他重写来加速更多的聚合。我们能否将terms聚合重写为filters聚合并获得相同的优化效果?很可能!我们是否可以通过将 date_histogram 聚合中的terms聚合视为filters聚合而不是另一个filters聚合来优化它?也许。我们是否可以将geo-distance聚合重写为环形过滤器?很可能,但实际上可能不会更快。即使它不会在本质上更快,是否值得这样做,以减少工作集?找出答案将是一件有趣的事情。
于是,这个全新的世界 需要 崭新的 基准测试。我们依靠JMH进行微基准测试,而依靠Rally进行宏观基准测试。我们每晚运行Rally并发布结果。但这是另一篇博客文章的故事了。
无论如何,看到自己的工作让图表变得更好是一件有趣的事情。总的来说,这是一次有趣的旅程。在过去的一年里,我阅读的汇编语言比过去15年加起还要多。(后面的都是宣传广告了,就不贴了)
结束
感谢您的阅读,别忘了点赞、收藏哟~ Thanks♪(・ω・)ノ
相关文章:
译文:我们如何使 Elasticsearch 7.11 中的 date_histogram 聚合比以往更快
这篇文章是ES7.11版本的文章,主要学习的是思路,记录在这里留作以后参考用。 原文地址:https://www.elastic.co/cn/blog/how-we-made-date-histogram-aggregations-faster-than-ever-in-elasticsearch-7-11 正文开始: Elasticsea…...
python设计模式4:适配器模式
使用适配器模式使用两个或是多个不兼容的接口兼容。在不修改不兼容代码的情况下使用适配器模式实现接口一致性。通过Adapter 类实现。 例子: 一个俱乐部类Club,艺术加被请到俱乐部在表演节目: organize_performance()…...
kubectl资源管理命令---声明式
目录 一、yaml和json介绍 1、yuml语言介绍 2、k8s支持的文件格式 二、声明式对象管理 1、deployment.yaml文件详解 2、Pod yaml文件详解 3、Service yaml文件详解 三、编写资源配置清单 1、 编写yaml文件 2、 创建并查看pod资源 3、创建service服务对外提供访问并测试…...
IDEA使用-通过Database面板访问数据库
文章目录 前言操作过程注意事项1.无法下载驱动2.“Database”面板不显示数据库表总结前言 作为一款强大IDE工具,IDEA具有很多功能,本文将以MariaDB数据库访问为例,详细介绍如何通过IDE工具的Database面板来访问数据库。 操作过程 不同的版本操作会略有差异,这里我们用于演…...
单片机如何写好一个模块的驱动文件
搞单片机,MCU:STM32/GD32/HC32,通讯模组:4G/WIFI/BT/433,总线:USB/CAN/K/232/485,各种常见的传感器,都接触过。 一开始学习单片机的时候没有形成很好的编写习惯,如LED点亮/熄灭/闪烁…...
【C++笔记】C++多态
【C笔记】C多态 一、多态的概念及实现1.1、什么是多态1.2、实现多态的条件1.3、实现继承与接口继承1.4、多态中的析构函数1.5、抽象类 二、多态的实现原理 一、多态的概念及实现 1.1、什么是多态 多态的概念: 在编程语言和类型论中,多态(英…...
不想改代码!这样实现Reverse Sync测量时间同步精度
TSN的时间同步精度,指被测时钟与主时钟的最大偏差。在设备的组网过程中,最大的困难就是保证期望的时间同步精度。主时钟仅负责将自身的时间分发出去,难以判断其他设备的同步效果;此外,若在网络中某处发生了同步故障&am…...
【webrtc】 对视频质量的码率控制的测试与探索
目录 环境设置 transport-cc goog-remb (webrtc中的两种码率算法) 修改成remb算法 测试 效果 后续 可参考工程 环境设置 要到meshx上操作 telnet 112 然后执行factory_env show |grep meshx_ip 之后telnet meshx_ip 用户名admin 密码****.119 执行一下r…...
2003 - Can‘t connect to MysQL server on ‘39.108.169.0‘ (10060 “Unknown error“)
问题描述 某天和往常一样启动java项目,发现数据库出问题了,然后打开navicat,发现数据库的链接都连接不上, 一点击就会弹出报错框: 然后就各种上网搜索。 解决方案 上网查了一些解决方案,大部分都是说看…...
Python算法——选择排序
选择排序(Selection Sort)是一种简单的排序算法,它的基本思想是在未排序的部分中选择最小(或最大)的元素,然后将其放在已排序部分的末尾。选择排序不同于冒泡排序,它不需要反复交换元素…...
从「码农」到管理者,E人程序员的十年蜕变
点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 当我们谈论程序员创业时,常常会首先想到一些传统观念认为的挑战:沟通技巧不佳、逻…...
ant Java任务的jvmargs属性和<jvmarg>内嵌元素
ant的Java任务可以在运行Apache Ant的Java虚拟机内、或者启用另外的Java虚拟机运行一个Java类。 可以使用java任务的jvmargs属性,设置传递给在新进程中的java虚拟机的参数。但当java任务的fork禁用的时候,jvmargs属性会被忽略。jvmargs这个属性已经被废…...
XML External Entity-XXE-XML实体注入
XML 实体? XML 实体允许定义标签,在解析 XML 文档时这些标签将被内容替换。一般来说,实体分为三种类型: 内部实体 外部实体 参数实体。 必须在文档类型定义(DTD)中创建实体 一旦 XML 文档被解析器处理,它将js用定义的常量“Jo Smith”替换定义的实体。正如您所看到…...
生态扩展Spark Doris Connector
生态扩展Spark Doris Connector doris官网去查找相匹配的spark spark的安装: tar -zxvf spark-3.1.2-bin-hadoop3.2.tgzmv spark-3.1.2-bin-hadoop3.2 /opt/sparkspark环境配置:vim /etc/profile export SPARK_HOME/opt/spark export PATH$PATH:$SPAR…...
构建 hive 时间维表
众所周知 hive 的时间处理异常繁琐且在一些涉及日期的统计场景中会写较长的 sql,例如:周累计、周环比等;本文将使用维表的形式降低时间处理的复杂度,提前计算好标准时间字符串未来可能需要转换的形式。 一、表设计 结合业务场景常…...
Pycharm安装jupyter和d2l
安装 jupyter: jupyter是d2l的依赖库,没有它就用不了d2l pycharm中端输入pip install jupyter安装若失败则: 若网速过慢,则更改镜像源再下载: pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ pip …...
虹科案例 | AR内窥镜手术应用为手术节约45分钟?
相信医疗从业者都知道,在手术室中有非常多的医疗器械屏幕,特别是内窥镜手术室中医生依赖这些内窥镜画面来帮助病患进行手术。但手术室空间有限,屏幕缩放位置相对固定,在特殊场景下医生观看内窥镜画面时无法关注到病患的状态。这存…...
纳米银线 纳米银纳米线 平均直径: 50-100nm
(西)纳米银线 (安)含量(%):99.9 (瑞)平均直径: 50-100nm (20nm 30nm 60nm ) (禧)长度:10um …...
力扣labuladong——一刷day15
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣92. 反转链表 II二、力扣206. 反转链表 前言 一、力扣92. 反转链表 II /*** Definition for singly-linked list.* public class ListNode {* int…...
【开题报告】基于微信小程序的母婴商品仓储管理系统的设计与实现
1.研究背景 母婴商品是指专门为婴幼儿和孕产妇提供的各类产品,如婴儿奶粉、尿布、奶瓶、洗护用品等。随着社会经济的发展和人们对婴幼儿健康关注度的提高,母婴商品市场呈现出快速增长的趋势。同时,电子商务的兴起和互联网技术的发展…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
