当前位置: 首页 > news >正文

译文:我们如何使 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)是一种简单的排序算法,它的基本思想是在未排序的部分中选择最小(或最大)的元素,然后将其放在已排序部分的末尾。选择排序不同于冒泡排序,它不需要反复交换元素&#xf…...

从「码农」到管理者,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.研究背景 母婴商品是指专门为婴幼儿和孕产妇提供的各类产品,如婴儿奶粉、尿布、奶瓶、洗护用品等。随着社会经济的发展和人们对婴幼儿健康关注度的提高,母婴商品市场呈现出快速增长的趋势。同时,电子商务的兴起和互联网技术的发展&#xf…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

接口测试中缓存处理策略

在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)​现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)&#xff…...