译文:我们如何使 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♪(・ω・)ノ

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介

🎉🎉🎉 欢迎各位来到小白 p i a o 的学习空间! \color{red}{欢迎各位来到小白piao的学习空间!} 欢迎各位来到小白piao的学习空间!🎉🎉🎉 💖 C\Python所有的入…

大数据预处理与采集实验三:Urllib的GET和POST请求(1)

目录 Urllib基本操作-GET ➢没有进行utf-8编码的输出 ➢经过utf-8decode之后的输出 ➢ Timeout参数:捕获由于连接超时而引发的异常 ◆Urllib基本操作-定制请求头 ➢ 在GET请求中加入多个访问参数 ◆Urllib基本操作-POST ➢有道词典网页爬取:找到…

Linux基本网页访问--防火墙、服务管理、selinux强制访问

正常访问外部网络需要进行4部操作操作: 1、开启httpd服务systemctl restart httpd 2、关闭防火墙服务 systemctl stop firewalld 3、访问数据库时,需要开启数据库的服务systemctl restart mariadb 4、关闭强制访问 setenforce 0 1、防火墙管理 firewal…

有了定时关机,省时省力!如何在Windows 11中设置自动关机

你有时会忘记关闭Windows 11吗?如果是这样的话,也许你应该考虑安排关机时间,以确保你的电脑在忘记选择关机时也能关机。 当你需要等待大型游戏下载完成时,安排关闭也是一个好主意。你可以用一个相对简单的命令在Windows 11中设置自动关机。 计时器将在指定的倒计时时间过…

表白墙(服务器)

目录 0.需求 1.创建Maven项目 2.给pom.xml内引入三个依赖 3.完善目录,并补充web.xml中的内容 4.编写代码 后端代码 ​编辑前端代码 5.引入数据库 创建message表 创建工具类 往MessageServlet类中添加方法 0.需求 前面写好了表白墙页面,但存…

C# Onnx Ultra-Fast-Lane-Detection-v2 车道线检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; usi…

你真的会学习网络安全吗?

我敢说,现在网上90%的文章都没有把网络安全该学的东西讲清楚。 为什么?因为全网更多的都是在讲如何去渗透和公鸡,却没有把网安最注重的防御讲明白。 老话说得好:“攻击,是为了更好的防御。”如果连初衷都忘了&#xff…

数据结构和算法——用C语言实现所有图状结构及相关算法

文章目录 前言图的基本概念图的存储方式邻接矩阵邻接表十字链表临界多重表 图的遍历最小生成树普里姆算法(Prim)克鲁斯卡尔算法(Kruskal) 最短路径BFS求最短路径迪杰斯特拉算法(Dijkstra)弗洛伊德算法&…

Android Studio打包AAR

注意 依赖的Android Studio版本为4.2.2 更高的Android Studio版本使用方法可能有所不同,gradle的版本和gradle plugins的版本都会影响使用方式。 基于此,本文只能作为参考,而不能作为唯一答案,如果要完全依赖本文,则…

8年经验之谈 —— Redis的性能测试与优化!

Redis作为一种高性能的Key-Value数据库,一直受到众多开发者和企业的青睐。然而,在高并发、大数据存储的应用场景中,如何测试并优化Redis的性能,成为了问题。本文将从测试与优化两个方面来讲解如何达到最优的Redis性能。 一、性能…

深入浅出排序算法之计数排序

目录 1. 原理 2. 代码实现 3. 性能分析 1. 原理 首先看一个题目,有n个数,取值范围是 0~n,写出一个排序算法,要求时间复杂度和空间复杂度都是O(n)的。 为了达到这种效果,这一篇将会介绍一种不基于比较的排序方法。这…

K-means(K-均值)算法

K-means(k-均值,也记为kmeans)是聚类算法中的一种,由于其原理简单,可解释强,实现方便,收敛速度快,在数据挖掘、聚类分析、数据聚类、模式识别、金融风控、数据科学、智能营销和数据运…

我和云栖有个约会

云栖大会:聚焦创新,驱动未来 2009年,一场地方网站峰会在中国掀起了技术的浪潮。随着时间的推移,这场峰会逐渐演变成了全球领先的科技盛会——云栖大会。回首历史,云栖大会不仅是中国云计算产业发展的见证者&#xff0c…

高效分割分段视频:提升您的视频剪辑能力

在数字媒体时代,视频剪辑已经成为一项重要的技能。无论是制作个人影片、广告还是其他类型的视频内容,掌握高效的视频剪辑技巧都是必不可少的。本文将介绍如何引用云炫AI智剪高效地分割和分段视频,以提升您的视频剪辑能力。以下是详细的操作步…

2023-11-01 LeetCode每日一题(参加会议的最多员工数)

2023-11-01每日一题 一、题目编号 2127. 参加会议的最多员工数二、题目链接 点击跳转到题目位置 三、题目描述 一个公司准备组织一场会议,邀请名单上有 n 位员工。公司准备了一张 圆形 的桌子,可以坐下 任意数目 的员工。 员工编号为 0 到 n - 1 。…

appium操控微信小程序的坑

appium操控微信小程序的坑 打不开启动页面driver的context只有NATIVE_APP小程序上元素找不到 我打算使用appium操控微信小程序,只要能够获取到小程序的页面元素就算成功。下面都是我遇到的问题。 打不开启动页面 以下是我的appium的配置参数和代码: de…

基于Taro + React 实现微信小程序半圆滑块组件、半圆进度条、弧形进度条、半圆滑行轨道(附源码)

效果: 功能点: 1、四个档位 2、可点击加减切换档位 3、可以点击区域切换档位 4、可以滑动切换档位 目的: 给大家提供一些实现思路,找了一圈,一些文章基本不能直接用,错漏百出,代码还藏着掖…

Kubernetes - Ingress HTTP 升级 HTTPS 配置解决方案(新版本v1.21+)

之前我们讲解过 Kubernetes - Ingress HTTP 搭建解决方案,并分别提供了旧版本和新版本。如果连 HTTP 都没搞明白的可以先去过一下这两篇 Kubernetes - Ingress HTTP 负载搭建部署解决方案_放羊的牧码的博客-CSDN博客Kubernetes - Ingress HTTP 负载搭建部署解决方案…

SpringMVC Day 07 : 表单验证

前言 表单验证在Web开发中是非常常见和重要的一部分,它用于确保用户提交的数据符合预期的规则和限制。 通过表单验证,我们可以有效地捕获并处理用户输入中的错误或不正确的数据,从而提高应用程序的数据质量和用户体验。在本教程中&#xff…

Thread

Thread 线程启动线程第一种创建线程线程的第二种创建方式使用匿名内部类完成线程的两种创建 Thread API线程的优先级线程提供的静态方法守护线程用户线程和守护线程的区别体现在进程结束时 多线并发安全问题同步块 线程 启动线程 启动线程:调用线程的start方法,而不是直接调用…