我们如何在 Elasticsearch 8.6、8.7 和 8.8 中加速数据摄入

作者:Adrien Grand, Joe Gallo, Tyler Perkins

正如你们中的一些人已经注意到的,Elasticsearch 8.6、8.7 和 8.8 在各种数据集上带来了良好的索引加速,从简单的关键字到繁重的 KNN 向量,以及摄取管道繁重的摄取工作负载。 摄取涉及许多组件 —— 运行摄取管道、反转内存中的数据、刷新段、合并段 —— 所有这些通常都需要不可忽略的时间。 对你来说幸运的是,我们在所有这些领域都进行了改进,从而实现了更快的端到端摄取速度。

例如,在我们的基准测试中,8.8 的摄取速度比 8.6 快 13%,该基准模拟了具有多个数据集、摄取管道等的实际日志记录用例。 下图显示了在我们实施这些优化期间,摄取率从约 22.5k 文档/秒变为约 25.5k 文档/秒。

本博客深入探讨了一些有助于在 8.6、8.7 和 8.8 中实现摄取加速的更改。

更快地合并 kNN 向量

Elasticsearch 的 kNN 搜索的底层结构是 Lucene 的分层可导航小世界 (HNSW) 图。 该图甚至可以在数百万个向量上提供异常快速的 kNN 搜索。 然而,构建图表本身可能是一项昂贵的任务; 它需要在现有图上执行多次搜索、建立连接并更新当前的邻居集。 在 Elasticsearch 8.8 之前,当合并段(segements)时,会创建一个全新的 HNSW 图索引 - 这意味着来自每个段的每个向量都被单独添加到一个完全空的图中。 随着段规模的扩大,其数量也会增加,而合并的成本可能会高得令人望而却步。

在 Elasticsearch 8.8 中,Lucene 在合并 HNSW 图方面做出了重大改进。 Lucene 智能地重用现有最大的 HNSW 图。 因此,Lucene 不再像以前那样从空图开始,而是利用之前完成的所有工作来构建现有的最大分段。 当合并较大的段,这一变化的影响非常显着。 在我们自己的基准测试中,我们发现合并所用时间减少了 40% 以上,刷新吞吐量提高了一倍多。 这显着减少了索引较大矢量数据集时集群所经历的负载。

优化摄取管道

摄取管道(ingest pipelines)在索引文档之前使用处理器对文档执行转换 - 例如,设置或删除字段、解析日期或 JSON 字符串等值,以及使用 IP 地址或其他数据丰富查找地理位置。 通过摄取管道,可以从日志文件发送文本行,并让 Elasticsearch 完成繁重的工作,将该文本转换为结构化文档。 我们的大多数开箱即用的集成(integrations)都使用摄取管道,使你能够在几分钟内解析和丰富新的数据源。

在 8.6 和 8.7 中,我们通过多种方式优化了摄取管道和处理器:

  • 我们已经消除了单个文档经过多个管道处理的大部分开销。
  • 我们优化了一些最常用的处理器:
    • 使用 mustache 模板的 set 和 append 处理器现在可以更快地创建模板模型和执行 mustache 模板。
    • Date 处理器现在缓存其关联的日期解析器。
    • Geoip 处理器不再依赖反射(reflection)。
    • 在 8.6.0 中,我们通过两种方式优化了无痛脚本,改进了脚本处理器和条件检查。
  • 此外,摄取处理的总体指标和统计数据比以前更准确:
    • 正确考虑了管道执行后序列化数据所花费的时间。
    • 针对多个管道执行的文档仅计数一次。
  • 最后,低级热代码的优化减少了所有处理文档的开销,例如更快的集合交集、更快的元数据验证和更快的自引用检查。

结合所有这些改进,我们的每日安全集成基准的摄取管道性能提高了 45%,每日日志记录集成基准的摄取管道性能提高了 35%。

我们预计这些加速能够在升级到 8.7 或更新版本后,一些重要的摄入用例将会看到的改进。 

关键字和数字字段的优化

我们有许多数据集,其中大多数字段都是简单的数字和关键字字段,它们将自动受益于这些字段类型的改进。 两项主要改进有助于索引这些字段类型:

  • Elasticsearch 在适用时切换到 Lucene 的 IntField、LongField、FloatField 和 DoubleField(Lucene 9.5 中的新增功能)以及 Lucene 的 KeywordField(Lucene 9.6 中的新增功能)。 这些字段允许用户在单个 Lucene 字段上启用索引(indexing)和文档值(doc values) - 否则您需要提供两个字段:一个启用索引,另一个启用文档值。 事实证明,这一旨在使 Lucene 更加用户友好的更改也有助于提高索引率,超出了我们的预期! 请参阅注释 AH 和 AJ 以了解这些更改对 Lucene 夜间基准测试的影响。
  • 简单的关键字现在可以直接索引,而不是通过 TokenStream 抽象。 TokenStreams 通常是分析器的输出,并公开术语、位置、偏移量和有效负载 - 为文本字段构建倒排索引所需的所有信息。 为了保持一致性,还使用简单关键字通过生成返回单个标记的 TokenStream 来进行索引。 现在,关键字值会直接被索引,而无需经过 TokenStream 抽象。 请参阅注释 AH 以了解此更改对 Lucene 的夜间基准测试的影响。

索引排序的优化

索引排序是一项强大的功能,可以通过提前终止查询或将可能与相同查询匹配的文档聚集在一起来加速查询。 此外,索引排序是时间序列数据流基础的一部分。 因此,我们花了一些时间来解决索引排序的一些索引时间瓶颈。 这使得我们的基准摄取加速了 12%,该基准摄取了按 @timestamp 降序排序的简单 HTTP 日志数据集。

基于时间的数据的新合并策略

直到最近,Elasticsearch 一直依赖 Lucene 的默认合并策略:TieredMergePolicy。 这是一个非常明智的合并策略,它尝试将段组织成指数大小的层,其中默认情况下每层有 10 个段。 它擅长计算廉价的合并、回收删除等。 那么为什么要使用不同的合并策略呢?

时序数据的特殊之处在于它通常以近似@timestamp的顺序写入,因此通过后续刷新操作形成的段时间戳范围通常是不会重叠的。对于在@timestamp字段上进行范围查询,这是一个有趣的属性,因为许多段要么根本不与查询范围重叠,要么完全包含在查询范围内,这是处理范围查询非常高效的两种情况。不幸的是,段时间戳范围不重叠的特性会被TieredMergePolicy破坏,因为它更乐意将不相邻的段合并在一起。

所以有@timestamp日期类型字段的分片现在使用Lucene的LogByteSizeMergePolicy,它是TieredMergePolicy的前身. 两者之间的一个关键区别是LogByteSizeMergePolicy只会合并相邻的段,所以在假设数据以 @timestamp 顺序写入的情况下,这可以使得合并后段的@timestamp属性继续保持不会重叠。这个变化使得在EQL 基准测试中一些查询速度加快了多达3倍,这些查询需要按“@timestamp”顺序遍历事件的序列!

但这个属性也有一个缺点,因为LogByteSizeMergePolicy在计算相等大小段的合并方面不如 TieredMergePolicy灵活,这是通过合并限制写入放大的最佳方法。为了减轻这种不利影响,合并因子已从TieredMergePolicy的10提高到 32。虽然增加合并因子通常会使搜索速度变慢,但由于在相同的合并因子下, LogByteSizeMergePolicy比TieredMergePolicy会更积极地合并数据,并且保留段的@timestamp 范围不重叠极大地帮助了时间戳字段的范围查询,通常对于时序数据最常用的就是根据时间戳进行过滤。

这就是对 8.6、8.7 和 8.8写入性能提升的分析。我们会在后续多个小版本中带来更多的加速优化,敬请期待!

想要详细了解每个版本中包含的内容吗? 阅读他们各自的发布博客以了解详细信息:

  • 8.6 release blog
  • 8.7 release blog
  • 8.8 release blog
  • Elasticsearch 3rd Party Performance Report

原文:How we sped up data ingestion in Elasticsearch 8.6, 8.7, and 8.8 | Elastic Blog

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

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

相关文章

Java Mybatis拓展03

0目录 1.MyBatis当实体类和数据库字段名不对应 2.多表查询 1.MyBatis当实体类和数据库字段名不对应 方法2 测试 多表查询 加入子标签association 模糊查询 加入Address 对象 三表联查 2.五表联查 测试

使用 appium 进行微信小程序的自动化测试

目录 前言: 微信小程序结构 自动化用例的调整 示例代码 后记 前言: 微信小程序是一种流行的移动应用程序,它在移动设备上提供了丰富的功能和用户体验。为了确保微信小程序的质量和稳定性,自动化测试是必不可少的一环。Appiu…

el-table找出当前单元格与对应的上下列的值

当前单元格与对应的上下列的值如果不相同就设置个红色边框 当前单元格与对应的上下列的值如果不相同就设置个红色边框 当前单元格与对应的上下列的值如果不相同就设置个红色边框 以下是示例代码,对tableData数据的name字段进行处理 如果当前name值与上一条数据的na…

港联证券-尾盘集合竞价拉升意味着什么意思?

在股票市场中,尾盘集合竞价是指每个交易日的最后几分钟,即下午14:57到3:00之间的交易。在这段时间内,所有股票的买卖都将以竞价的方式进行,最终价格以最高买价与最低卖价的平均值确定,成交量也将作为当日的收盘价和成交…

科普一下Elasticsearch中BM25算法的使用

首先还是先了解几个概念,Elasticsearch是一个开源的分布式搜索和分析引擎,它使用一系列算法来计算文档的相关性分数(relevance score)。这些算法用于确定查询与文档的匹配程度,以便按相关性对搜索结果进行排序。以下是…

Unity URP 2D光照导入与配置

上面随时间变化的火烧云和晚霞,篝火的呼吸光照,都是URP的功劳。 1.什么是URP? URP 全称为 Universal Render Pipeline(通用渲染管线)。 它的特点是在手游和端游均能在保持性能的同时有良好的效果 也就说在多数情况下,在下面的平台…

10亿级用户,如何做 熔断降级架构?微信和hystrix的架构对比

说在前面 在40岁老架构师 尼恩的读者社区(50)中,最近有小伙伴拿到了一线互联网企业如极兔、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题: (1) 什么是熔断,降级?如何实现? (2) 服务熔…

linux内核调试工具记录

Linux性能测试使用的工具在github网站可见,网址如下: slides: http://www.slideshare.net/brendangregg/linux-performance-analysis-new-tools-and-old-secrets video: https://www.usenix.org/conference/lisa14/conference-program/presentation/greg…

LLM微调 | LoRA: Low-Rank Adaptation of Large Language Models

🔥 发表于论文:(2021) LoRA: Low-Rank Adaptation of Large Language Models 😄 目的:大模型预训练微调范式,微调成本高。LoRA只微调新增的小部分参数。 文章目录 1、背景2、动机3、LoRA原理4、总结 1、背景 adapter…

BUFG/BUFGCE/BUFH/BUFHCE/BUFH/BUFGHCE/BUFMR/BUFMRCE/BUFR/IBUF/IBUFDS

本文对BUFG/BUFGCE/BUFH/BUFHCE简单介绍,便于后续查看。 原语的使用:在vivado中找到所要用的原语,直接将其实例化到设计中即可。 文章目录 BUFGBUFGCEBUFHBUFHCEBUFMRBUFRBUFMRCEIBUFIBUFDS 下图为 7 系列 FPGA 时钟架构图: BU…

又卡了,大数据平台容器化运维走起

文章目录 一、背景二、方案总结三、方案实施3.0 转移数据修改docker默认存储位置3.1 手动清理3.2 定时容器日志清理3.3 限制 Docker 容器日志大小 大家好,我是脚丫先生 (o^^o) 大数据基础平台的搭建,我采用的是全容器化Apache的大数据组件。 之前还很美…

Java对象深拷贝、浅拷贝之枚举类型

问题:为什么属于引用类型的enum不会有深拷贝浅拷贝的问题? 解释: 在Java中,枚举类型是一种特殊的类类型。每个枚举值都是该枚举类型的一个实例,并且这些实例在枚举类型被初始化时就已经被创建。这些实例在程序的整个…

如何二次封装一个el-table组件并二次复用

*注:示例使用的是vue3和element进行二次封装的 首先我们来看效果图(总共可以分为以下几个模块): 表格数据操作按钮区域表格信息提示区域表格主体内容展示区域表格分页区域 表单搜索没有封装在这里是为了降低代码的耦合性(有兴趣的可以查看我…

rt-thread构建含c++源码的工程

RT-Thread Components > C/C and POSIX layerscons构建项目会出错: vim libraries/SConscript ,删除 pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp(切记不要注释,要删除) 再次scons构建项目&#…

【FPGA】基于C5的第一个SoC工程

文章目录 前言SoC的Linux系统搭建 前言 本文是在毕业实习期间学习FPGA的SoC开发板运行全连接神经网络实例手写体的总结。 声明:本文仅作记录和操作指南,涉及到的操作会尽量细致,但是由于文件过大不会分享文件,具体软件可以自行搜…

手机定屏死机问题操作指南

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、定屏死机问题抓取 Log 要求二、 复现定屏死机问题后做什么三、检查adb是否可连的方法四、连接adb 抓取以下Log五、如果adb不可连,执行下…

多个信贷范围时客户主数据界面的定制(套头和信用缴纳范围=信贷范围)

客户主数据-销售范围-开票的界面有信贷范围,叫贷方控制范围。 但是默认是看不到的。需要进行配置。 但是SAP的配置里面的名字很奇怪,在客户账户组里面的销售数据中(OVT0)定制 双击后处理的这个界面,和界面的“”开票凭证“”对不上&#x…

SaleSmartly,客户满意度调查的绝对好助手

企业使用客户满意度调查来收集反馈并评估客户满意度水平,包括有关产品质量、服务、支持和整体满意度的问题。客户满意度调查的主要目标是直接从客户那里收集有价值的见解,以了解他们的需求、偏好和期望。这种反馈可以帮助企业确定需要改进的领域&#xf…

Fiddler抓包app(方便后端定位app调用的是那个接口?参数为何?)

一、抓http请求的包 1、设置Fiddler允许远程连接 选择Tools->Options 选择Connections选项卡,选中允许远程连接,如图所示 2、手机与电脑连接相同的wlan网络 3、手机wlan设置手动代理, 1)手动代理的主机名设为电脑ip&…

5分钟给你破解这套10万赞的生产教程,访谈乔布斯的AI对话数字人视频是怎么做的

本期是赤辰第16期AI项目拆解栏目; 底部准备了7月粉丝福利,看完可以领取; 上周给粉丝们讲解AI动图说话月涨粉20万的案例并给出保姆式教程,粉丝反馈很热烈,都觉得AI强大,有些学员给自己账号做视频&#xff…