Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何分析和优化 Elastic 部署的存储占用

如何分析和优化 Elastic 部署的存储占用

原创
作者头像
点火三周
发布于 2025-03-07 13:16:44
发布于 2025-03-07 13:16:44
142010
代码可运行
举报
文章被收录于专栏:Elastic Stack专栏Elastic Stack专栏
运行总次数:10
代码可运行

你是否曾经查看你的索引,想要了解更多关于存储消耗的细节?或者你使用默认设置导入了自定义数据,想知道数据建模的哪些部分可以产生最大的影响?在这篇博客文章中,我们将探讨如何使用 Elastic 最近推出的 磁盘使用 API 来回答这些问题。

在 Elastic,我们与客户合作时,最常改进的领域之一就是索引映射配置。缺乏映射或使用错误的类型会增加你的 Elastic 部署的存储使用量。本文将帮助你理解哪些字段对存储占用影响最大,以及如何通过最佳实践配置来优化存储消耗。

开始

如果你还没有使用 Elastic,可以通过 Elastic Cloud 创建一个托管的 Elasticsearch 服务部署。部署包括一个用于存储和搜索数据的 Elasticsearch 集群,以及一个用于可视化和管理数据的 Kibana 实例。有关更多信息,请参阅 启动 Elastic Stack。我建议在开发或测试环境中进行本次练习。

你还需要一些数据存储在 Elasticsearch 索引中进行分析。如果你刚创建了一个新的集群,可以通过 使用 Kibana 添加一些示例数据。在我的例子中,我使用了一些通过 Filebeat 导入的日志数据

如果你使用 Elastic 的 Beats 或 Elastic Agent 索引数据,这些数据很可能已经按照 Elastic 的最佳实践进行了建模。当然,这非常棒,但也使得这个练习变得不那么有趣。幸运的是,我们可以通过将数据模型复制到没有映射配置的索引中来轻松丢弃数据模型。我选择了我的一个索引,并使用 Kibana 开发工具执行了以下重索引操作:

代码语言:json
AI代码解释
复制
POST _reindex/
{
  "source": {
    "index": "filebeat-7.16.2-2022.01.06-000001"
  }, 
  "dest": {
    "index": "nomapping-filebeat"
  }
}

注意,我选择了一个以不匹配任何 Elastic 标准索引模式的前缀开头的目标索引名称。这确保不会从我的索引模板自动应用映射。

有了两个索引副本,一个有适当的映射,另一个没有,我们将能够在后面的博客文章中进行并排比较。

最后的前提是 jq,这是一个非常棒的 JSON 操作工具。我们将使用 jq 将 API 响应转换为文档列表,然后可以轻松地使用 Kibana 导入到 Elasticsearch 中。这将使得使用 Kibana 的 Discover 界面分析 API 响应变得更容易。

使用磁盘使用 API

调用 磁盘使用 API 非常简单,只需前往 Kibana 开发工具并发出类似的请求:

代码语言:json
AI代码解释
复制
POST nomapping-filebeat/_disk_usage?run_expensive_tasks=true

注意,run_expensive_tasks 参数是必需的,通过提供它,我承认我正在给集群增加额外的负载。这也是我之前建议在非生产集群中进行此练习的原因。

这是我的响应的顶部部分:

代码语言:json
AI代码解释
复制
{
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "nomapping-filebeat" : {
    "store_size" : "23.3mb",
    "store_size_in_bytes" : 24498333,
    "all_fields" : {
      "total" : "22.7mb",
      "total_in_bytes" : 23820161,
      "inverted_index" : {
        "total" : "9.9mb",
        "total_in_bytes" : 10413531
      },
      "stored_fields" : "8mb",
      "stored_fields_in_bytes" : 8404459,
      "doc_values" : "3.1mb",
      "doc_values_in_bytes" : 3284983,
      "points" : "1.1mb",
      "points_in_bytes" : 1237784,
      "norms" : "468.1kb",
      "norms_in_bytes" : 479404,
      "term_vectors" : "0b",
      "term_vectors_in_bytes" : 0
    }

响应提供了整个索引的存储使用情况的详细信息。我们可以看到倒排索引是最大的因素,其次是存储字段和文档值。

在响应的进一步部分,我得到了每个字段的详细信息,包括 host.name 字段。

代码语言:json
AI代码解释
复制
"fields" : {"host.name" : {
        "total" : "23.2kb",
        "total_in_bytes" : 23842,
        "inverted_index" : {
          "total" : "23.2kb",
          "total_in_bytes" : 23842
        },

我们可以很容易地对 API 结果感到满意。通过在响应标签中使用 CTRL-F 功能并搜索“mb”(即兆字节),我们可以快速识别索引中的几个大字段。不过,让我们更进一步,看看如何快速重新格式化响应并使用 Kibana 进行分析。

在 Kibana 中分析字段磁盘使用情况

将 API 结果复制粘贴到你喜欢的文本编辑器中,并将其保存为文件,在我的例子中是 disk-usage-filebeat.json。然后运行以下命令,替换 nomapping-filebeat 为你的索引名称,替换 disk-usage-filebeat.json 为你最近保存的文件:

代码语言:shell
AI代码解释
复制
jq -c '.["nomapping-filebeat"].fields | to_entries | map({field: .key} + .value) | .[]' disk-usage-filebeat.json > disk-usage-ld.json

该命令将 JSON 转换为对象列表,每个对象包括字段名称和相关的使用数据,并输出换行符分隔的 JSON。有关更多信息,请参阅 jq 手册

现在我们可以使用 Kibana 中的 数据可视化工具 上传数据,找到机器学习 -> 数据可视化工具。导航到可视化工具,点击导入文件并上传你的 disk-usage-ld.json 文件。结果页面应包括类似于以下截图的字段,与 API 响应中的字段分析相匹配。

enter image description here
enter image description here

向下滚动,点击导入并命名存储磁盘使用数据的索引。确保选中“创建索引模式”复选框。

enter image description here
enter image description here

正如你所见,我命名我的索引为 disk-usage。在下一个屏幕上点击索引模式管理。你也可以通过主菜单导航:堆栈管理 -> 索引模式

我们将使用 Kibana 中的 格式化功能 来提高字节字段的可读性。对于以下字段,点击编辑并选择字节作为格式:

  • doc_values_in_bytes
  • inverted_index.total_in_bytes
  • stored_fields_in_bytes
  • total_in_bytes

提示:在搜索字段中输入 bytes 可以快速找到这些字段,如下图所示。

enter image description here
enter image description here

现在我们准备好可视化我们的字段数据了。导航到 Discover 并选择 disk-usage 索引模式。添加以下列:

  • field
  • stored_fields_in_bytes
  • inverted_index.total_in_bytes
  • doc_values_in_bytes
  • total_in_bytes

total_in_bytes 降序排序。

enter image description here
enter image description here

正如你所见,我最大的字段是 _source。这是一个内置字段,存储原始文档,我们几乎总是想保留它。接下来的两个字段是 host.machost.ip。进一步向下看,我们还可以看到相同字段带有 .keyword 后缀。根据 Elasticsearch 的 动态映射默认值,这些字段被设置为带有关键字多字段的文本字段。我还注意到,文本字段的存储空间被倒排索引占用,而关键字字段主要由文档值占用,这些文档值用于聚合和排序。

将文本和关键字大小加在一起,总大小为:

  • host.mac + host.mac.keyword = 5.3 MB
  • host.ip + host.ip.keyword = 3 MB

与最佳实践对比

让我们导航到 开发工具 并查看原始的 filebeat 索引。这个索引已经应用了 Elastic Common Schema 映射。

我使用以下命令获取原始索引的磁盘使用信息:

代码语言:json
AI代码解释
复制
POST filebeat-7.16.2-2022.01.06-000001/_disk_usage?run_expensive_tasks=true

从响应中,我读取到 host.iphost.mac 字段的以下信息:

代码语言:json
AI代码解释
复制
"host.ip" : {
        "total" : "1.3mb""host.mac" : {
        "total" : "492.1kb",

可以看出,存储使用量减少了 2-5 倍。要查看映射,我们可以使用以下命令获取:

代码语言:json
AI代码解释
复制
GET filebeat-7.16.2-2022.01.06-000001/_mapping/field/host.ip,host.mac

我可以看到 host.ip 被映射为 ip 类型,host.mac 被映射为关键字类型。在大多数情况下,存储在这些字段中的数据类型将用于精确过滤、聚合和排序,这意味着将它们映射为文本字段对分析没有额外价值,并且在集群中占用了额外的存储空间。

结论和下一步

在这篇博客文章中,我们看到了如何使用磁盘使用 API 来了解哪些字段在存储利用率方面最昂贵。我们使用 jq 格式化 API 响应,并使用数据可视化工具将其重新导入 Elastic,以便在 Discover 中分析数据。我们还看到了适当的映射如何显著减少存储占用。那么,如何优化我们索引中的存储使用呢?

使用 Elastic 集成

通过使用 Elastic 的 集成,无论是通过 Beats 还是 Elastic Agent,字段映射都会在数据导入时自动创建。请注意,如果你不直接将数据发送到 Elasticsearch,例如通过 Logstash 发送 Filebeat 数据,则可能需要手动加载索引模板。

配置映射

如果你使用的是自定义数据,通常需要手动配置映射。为了确保你的映射被应用,将其定义在具有适当索引模式的 索引模板 中。

快速映射单个字段会变得繁琐。对于大多数机器生成的数据,我们通常希望将大部分字符串映射为关键字类型,因此包括如下示例的 动态模板 将节省大量时间。不要忘记为 IP 和用于自由文本搜索的文本(如标准字段“message”)添加特定映射。

代码语言:json
AI代码解释
复制
"mappings": {
    "dynamic_templates": [
      {
         "strings_as_keyword" : {
           "match_mapping_type" : "string",
           "mapping" : {
             "ignore_above" : 1024,
             "type" : "keyword"
           }
         }
       }
    ]
  }

在命名和分配字段类型时,我们建议参考 Elastic Common Schema。它将帮助你构建一致的数据模型,并允许你在 Kibana 的应用程序中查看自定义数据。

实施存储层

一个稍微偏离主题但重要的工具是 数据层。通过使用数据层,你可以在数据老化时将其移动到更便宜的硬件中。我们的冷冻层甚至允许你 将数据存储在 Blob 存储中,这显著降低了成本,并且适用于不常访问的数据或在较慢查询响应可以接受时。使用 Elastic Cloud 管理数据层是最简单的方式,请查看我们的 数据管理最佳实践 以开始使用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用深度学习keras的cnn做图像识别分类,准确率达97%
Keras是一个简约,高度模块化的神经网络库。 可以很容易和快速实现原型(通过总模块化,极简主义,和可扩展性) 同时支持卷积网络(vision)和复发性的网络(序列数据)。以及两者的组合。 无缝地运行在CPU和GPU上。 keras的资源库网址为https://github.com/fchollet/keras olivettifaces人脸数据库介绍 Olivetti Faces是纽约大学的一个比较小的人脸库,由 40个人的400张图片构成,即每个人的人脸图片为10张。每张图片的灰度级为8位,每个像素
机器学习AI算法工程
2018/03/15
2.7K0
用深度学习keras的cnn做图像识别分类,准确率达97%
入门项目数字手写体识别:使用Keras完成CNN模型搭建
对于图像分类任务而言,卷积神经网络(CNN)是目前最优的网络结构,没有之一。在面部识别、自动驾驶、物体检测等领域,CNN被广泛使用,并都取得了最优性能。对于绝大多数深度学习新手而言,数字手写体识别任务可能是第一个上手的项目,网络上也充斥着各种各样的成熟工具箱的相关代码,新手在利用相关工具箱跑一遍程序后就能立刻得到很好的结果,这时候获得的感受只有一个——深度学习真神奇,却没能真正了解整个算法的具体流程。本文将利用Keras和TensorFlow设计一个简单的二维卷积神经网络(CNN)模型,手把手教你用代码完成MNIST数字识别任务,便于理解深度学习的整个流程。
用户3578099
2019/08/16
9110
我们建了个模型,搞定了 MNIST 数字识别任务
对于图像分类任务,当前最先进的架构是卷积神经网络 (CNNs).。无论是面部识别、自动驾驶还是目标检测,CNN 得到广泛使用。在本文中,针对著名的 MNIST 数字识别任务,我们设计了一个以 tensorflow 为后台技术、基于 keras 的简单 2D 卷积神经网络 (CNN) 模型。整个工作流程如下:
AI研习社
2018/07/26
7830
我们建了个模型,搞定了 MNIST 数字识别任务
手把手教你使用CNN进行交通标志识别(已开源)
在本文中,使用Python编程语言和库Keras和OpenCV建立CNN模型,成功地对交通标志分类器进行分类,准确率达96%。开发了一款交通标志识别应用程序,该应用程序具有图片识别和网络摄像头实时识别两种工作方式。
小白学视觉
2022/12/28
3.1K0
手把手教你使用CNN进行交通标志识别(已开源)
Keras Callback之RemoteMonitor
Keras提供了一系列的回调函数,用来在训练网络的过程中,查看网络的内部信息,或者控制网络训练的过程。BaseLogger、ProgbarLogger用来在命令行输出Log信息(默认会调用), EarlyStopping、ReduceLROnPlateu分别用来提前终止训练和自动调整学习率,改变网络训练过程;而今天要介绍的RemoteMonitor则用来实时输出网络训练过程中的结果变化情况,包括训练集准确率(accu)、训练集损失值(loss)、验证集准确率(val_acc)、验证集损失值(val_loss),用户也可以自己修改需要显示的数据。一图胜千言,看看下面的结果图吧:
王云峰
2019/12/25
9380
Keras Callback之RemoteMonitor
是选择Keras还是PyTorch开始你的深度学习之旅呢?
原文:https://medium.com/@karan_jakhar/keras-vs-pytorch-dilemma-dc434e5b5ae0
kbsc13
2020/05/22
5860
数字识别,从KNN,LR,SVM,RF到深度学习
@蜡笔小轩V 原文:http://blog.csdn.net/Dinosoft/article/details/50734539 之前看了很多入门的资料,如果现在让我来写写,我觉得我会选择”数字识别(digit recognizer)”作为例子,足够有趣,而且能说明很多问题。kaggle是个实践的好地方,python是门方便的语言,sklearn是个不错的库,文档很适合学习。那就用sklearn来实践一下机器学习,加深理解吧! kaggle数据读取 import pandas as pdimport nu
机器学习AI算法工程
2018/03/13
1.9K0
数字识别,从KNN,LR,SVM,RF到深度学习
Keras介绍
Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:
用户7886150
2021/02/14
1.2K0
TensorFlow快餐教程:程序员快速入门深度学习五步法
作者简介:刘子瑛,阿里巴巴操作系统框架专家;CSDN 博客专家。工作十余年,一直对数学与人工智能算法相关、新编程语言、新开发方法等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术进步。 作为一个程序员,我们可以像学习编程一样学习深度学习模型开发。我们以 Keras 为例来说明。 我们可以用 5 步 + 4 种基本元素 + 9 种基本层结构,这 5-4-9 模型来总结。 5步法: 1. 构造网络模型 2. 编译模型 3. 训练模型 4. 评估模型 5. 使用模型进行预测 4种基本元素:
用户1737318
2018/07/20
5130
【深度残差收缩网络】超简单Keras代码
从本质上讲,深度残差收缩网络属于卷积神经网络,是深度残差网络(deep residual network, ResNet)的一个变种。它的核心思想在于,在深度学习进行特征学习的过程中,剔除冗余信息是非常重要的;软阈值化是一种非常灵活的、删除冗余信息的方式。
用户6831054
2019/12/31
2.3K0
【深度残差收缩网络】超简单Keras代码
使用 MNIST 集入门 Tensoflow(1)
在入门之前,我们需要开发工具,本文使用 JupyterLab,可以用 conda 或者 pip 方式安装。
coding01
2021/02/24
4270
TensorFlow快餐教程:程序员快速入门深度学习五步法
作为一个程序员,我们可以像学习编程一样学习深度学习模型开发。我们以 Keras 为例来说明。
AI科技大本营
2018/07/23
4320
TensorFlow快餐教程:程序员快速入门深度学习五步法
用多层感知机识别手写体(Keras)
独热编码即 One-Hot-coding,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。例如对六个状态进行编码:自然顺序码为 000,001,010,011,100,101独热编码则是 000001,000010,000100,001000,010000,100000
用户3577892
2020/06/11
2.7K0
Auto ML 一种自动完成机器学习任务的系统
在 2018 年比较火,很多大公司都开源了各自的auto ml库,例如 Cloud AutoML, AUTO KERAS, Auto Sklearn, Auto Weka 等,
杨熹
2019/02/20
5540
Auto ML 一种自动完成机器学习任务的系统
Keras-深度学习-神经网络-手写数字识别模型
使用到的数据集为IMDB电影评论情感分类数据集,该数据集包含 50,000 条电影评论,其中 25,000 条用于训练,25,000 条用于测试。每条评论被标记为正面或负面情感,因此该数据集是一个二分类问题。
叶茂林
2023/07/30
2890
Keras-深度学习-神经网络-手写数字识别模型
Keras入门级MNIST手写数字识别超级详细教程
文件下载:https://download.csdn.net/download/sxf1061700625/19229794
小锋学长生活大爆炸
2021/05/30
6.7K0
Keras入门级MNIST手写数字识别超级详细教程
Python人工智能 | 十七.Keras搭建分类神经网络及MNIST数字图像案例分析
从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章详细讲解了Keras环境搭建、入门基础及回归神经网络案例。本篇文章将通过Keras实现分类学习,以MNIST数字图片为例进行讲解。基础性文章,希望对您有所帮助!
Eastmount
2022/04/19
1.1K0
Python人工智能 | 十七.Keras搭建分类神经网络及MNIST数字图像案例分析
深度学习|Keras识别MNIST手写数字(一)
MNIST数据集是收集的手写字体,为单色图像,共有训练集60000项,测试数据集10000项。 建模方法我们使用最简单的神经网络模型,多层感知器(MLP)。
罗罗攀
2019/02/22
1.1K0
深度学习|Keras识别MNIST手写数字(一)
基于keras的手写数字识别_数字识别
Flatten层: Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡,举例如下
全栈程序员站长
2022/10/05
2K0
100天搞定机器学习|day39 Tensorflow Keras手写数字识别
有些教程会推荐安装nightly,它适用于在一个全新的环境下进行TensorFlow的安装,默认会把需要依赖的库也一起装上。我使用的是anaconda,本文我们安装的是纯净版的tensorflow,非常简单,只需打开Prompt:
Ai学习的老章
2019/08/09
5660
100天搞定机器学习|day39 Tensorflow Keras手写数字识别
推荐阅读
相关推荐
用深度学习keras的cnn做图像识别分类,准确率达97%
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验