文章目录

  • 概述
  • 官网
  • fielddata核心原理
  • fielddata内存限制
  • 监控fielddata内存使用
  • circuit breaker
  • fielddata filter的细粒度内存加载控制
  • fielddata预加载机制以及序号标记预加载
    • fielddata预加载 eager
    • 序号标记预加载 eager_global_ordinals


概述

继续跟中华石杉老师学习ES,第52篇

课程地址: https://www.roncoo.com/view/55


官网

中文指南(2.x):戳这里


fielddata核心原理

fielddata加载到内存的过程是lazy加载的,对一个analzyed field执行聚合时,才会加载,而且是field-level加载的.

一个index的一个field,所有doc都会被加载,而不是少数doc,不是index-time创建,是query-time创建


fielddata内存限制

indices.fielddata.cache.size: 20%,超出限制,清除内存已有fielddata数据
fielddata占用的内存超出了这个比例的限制,那么就清除掉内存中已有的fielddata数据.

默认无限制,限制内存使用,但是会导致频繁evict和reload,大量IO性能损耗,以及内存碎片和gc

查询

  GET _cat/nodes?v&h=id,ip,port,r,ramPercent,ramCurrent,heapMax,heapCurrent,fielddataMemory,queryCacheMemory,requestCacheMemory,segmentsMemory

indices.fielddata.cache.size 控制为 fielddata 分配的堆空间大小。 当你发起一个查询,分析字符串的聚合将会被加载到 fielddata,如果这些字符串之前没有被加载过。如果结果中 fielddata 大小超过了指定 大小 ,其他的值将会被回收从而获得空间。

默认情况下,设置都是 unbounded ,Elasticsearch 永远都不会从 fielddata 中回收数据。

这个默认设置是刻意选择的:fielddata 不是临时缓存。它是驻留内存里的数据结构,必须可以快速执行访问,而且构建它的代价十分高昂。如果每个请求都重载数据,性能会十分糟糕。

设想我们正在对日志进行索引,每天使用一个新的索引。通常我们只对过去一两天的数据感兴趣,尽管我们会保留老的索引,但我们很少需要查询它们。不过如果采用默认设置,旧索引的 fielddata 永远不会从缓存中回收! fieldata 会保持增长直到 fielddata 发生断熔(请参阅 断路器),这样我们就无法载入更多的 fielddata。

这个时候,我们被困在了死胡同。但我们仍然可以访问旧索引中的 fielddata,也无法加载任何新的值。相反,我们应该回收旧的数据,并为新值获得更多空间。

为了防止发生这样的事情,可以通过在 config/elasticsearch.yml 文件中增加配置为 fielddata 设置一个上限:

indices.fielddata.cache.size:  20%

可以设置堆大小的百分比,也可以是某个值,例如: 5gb 。

有了这个设置,最久未使用(LRU)的 fielddata 会被回收为新数据腾出空间。

在 Fielddata的大小 中,我们提过关于给 fielddata 的大小加一个限制,从而确保旧的无用 fielddata 被回收的方法。 indices.fielddata.cache.sizeindices.breaker.fielddata.limit 之间的关系非常重要。

如果断路器的限制低于缓存大小,没有数据会被回收。为了能正常工作,断路器的限制 必须 要比缓存大小要高


监控fielddata内存使用

GET /_stats/fielddata?fields=*
GET /_nodes/stats/indices/fielddata?fields=*
GET /_nodes/stats/indices/fielddata?level=indices&fields=*

circuit breaker

如果一次query load的feilddata超过总内存,就会oom --> 内存溢出

circuit breaker会估算query要加载的fielddata大小,如果超出总内存,就短路,query直接失败

indices.breaker.fielddata.limit:fielddata的内存限制,默认60%
indices.breaker.request.limit:执行聚合的内存限制,默认40%
indices.breaker.total.limit:综合上面两个,限制在70%以内

fielddata filter的细粒度内存加载控制


POST /test_index/_mapping/my_type
{"properties": {"my_field": {"type": "text","fielddata": { "filter": {"frequency": { "min":              0.01, "min_segment_size": 500  }}}}}
}
  • min:仅仅加载至少在1%的doc中出现过的term对应的fielddata

    比如说某个值,hello,总共有1000个doc,hello必须在10个doc中出现,那么这个hello对应的fielddata才会加载到内存中来

  • min_segment_size:少于500 doc的segment不加载fielddata

加载fielddata的时候,也是按照segment去进行加载的,某个segment里面的doc数量少于500个,那么这个segment的fielddata就不加载

这个fielddata filter一般不会去设置它,了解就好。


fielddata预加载机制以及序号标记预加载

如果真的要对分词的field执行聚合,那么每次都在query-time现场生产fielddata并加载到内存中来,速度可能会比较慢,是不是可以预先生成加载fielddata到内存中来???

fielddata预加载 eager

POST /test_index/_mapping/test_type
{"properties": {"test_field": {"type": "string","fielddata": {"loading" : "eager" }}}
}

query-time的fielddata生成和加载到内存,变为index-time,建立倒排索引的时候,会同步生成fielddata并且加载到内存中来,这样的话,对分词field的聚合性能当然会大幅度增强.


序号标记预加载 eager_global_ordinals

global ordinal原理解释

doc1: status1
doc2: status2
doc3: status2
doc4: status1

有很多重复值的情况,会进行global ordinal标记

status1 --> 0
status2 --> 1

doc1: 0
doc2: 1
doc3: 1
doc4: 0

建立的fielddata也会是这个样子的,这样的好处就是减少重复字符串的出现的次数,减少内存的消耗

POST /test_index/_mapping/test_type
{"properties": {"test_field": {"type": "string","fielddata": {"loading" : "eager_global_ordinals" }}}
}

白话Elasticsearch52-深入聚合数据分析之fielddata内存控制、circuit breaker短路器、fielddata filter、预加载机制以及序号标记预加载相关推荐

  1. 白话Elasticsearch37-深入聚合数据分析之案例实战Date Histogram Aggregation:统计每月电视销量

    文章目录 概述 官方说明 实例: 统计每月电视销量,没有销量的月份也要统计 概述 继续跟中华石杉老师学习ES,第37篇 课程地址: https://www.roncoo.com/view/55 官方说 ...

  2. 白话Elasticsearch34-深入聚合数据分析之案例实战bucket嵌套实现颜色+品牌的多层下钻分析

    文章目录 概述 案例 需求 解决 Step1.对每种颜色进行bucket分组 Step2.对每种颜色进行bucket分组 , 然后对每个分组再次计算平均价格 Step3.对每种颜色进行bucket分组 ...

  3. 白话Elasticsearch33-深入聚合数据分析之案例实战bucket + metrics 统计每种颜色电视平均价格

    文章目录 概述 官方说明Avg Aggregation 案例:统计每种颜色电视平均价格 概述 继续跟中华石杉老师学习ES,第33篇 课程地址: https://www.roncoo.com/view/ ...

  4. 白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理

    文章目录 概述 官网 示例 对于分词的field执行aggregation,报错 给分词的field,设置fielddata=true,可执行 使用field.keyword,对分词的field进行聚 ...

  5. 白话Elasticsearch47-深入聚合数据分析之Cardinality Aggs-cardinality算法之优化内存开销以及HLL算法

    文章目录 概述 官方说明 precision_threshold优化准确率和内存开销 HyperLogLog++ (HLL)算法性能优化 概述 继续跟中华石杉老师学习ES,第47篇 课程地址: htt ...

  6. 白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理

    文章目录 概述 思考 知识点 举例说明 纯用倒排索引来实现的弊端 倒排索引+正排索引(doc value)的原理和优势 概述 继续跟中华石杉老师学习ES,第50篇 课程地址: https://www. ...

  7. 白话Elasticsearch31-深入聚合数据分析之bucket与metric

    文章目录 概述 Bucket Aggregations Metrics Aggregations 概述 继续跟中华石杉老师学习ES,第31篇 课程地址: https://www.roncoo.com/ ...

  8. 白话Elasticsearch53-深入聚合数据分析之Collect Model_bucket优化机制:深度优先、广度优先

    文章目录 概述 官网 示例 概述 继续跟中华石杉老师学习ES,第53篇 课程地址: https://www.roncoo.com/view/55 官网 Collect Model:戳这里 示例 当bu ...

  9. 白话Elasticsearch50-深入聚合数据分析之doc values机制

    文章目录 概述 官网 doc value原理 (1)index-time生成 (2)核心原理与倒排索引类似 (3)性能问题:给jvm更少内存,64g服务器,给jvm最多16g column压缩 (1) ...

最新文章

  1. 客户区和非客户区指的什么?窗口客户区和视图客户区的区别
  2. Python自动化运维技术与最佳实现
  3. django如何给上传的图片重命名(给上传文件重命名)
  4. $(document).ready()和window.onload之间的差异
  5. 20190808估值方法
  6. session的简单理解和使用
  7. SpringMVC中请求的转发和重定向
  8. 思维模型篇:数据化营销的六脉神剑
  9. 古龙奇侠传java6_华人最著名的20位武侠小说家,梁羽生排不进前6,古龙屈居第5...
  10. c语言一行黑白相间的瓷砖,磁砖样式——第八届蓝桥杯C语言B组(国赛)第二题...
  11. linux mint 解压zip,Linux:压缩解压
  12. 两寸证件照怎么弄?如何制作两寸证件照?
  13. 69 Three.js 导入Collada(.dae)格式的模型
  14. 腾达怎么弄虚拟服务器,腾达(Tenda)路由器端口映射设置方法
  15. 推荐两个长宽数据互换函数pivot_longer和pivot_wider
  16. 易基因 | 新研究:ChIP-seq揭示酒精性肝炎超级增强子调控机制
  17. 生物类实验室安全管理
  18. 如果今天是生命里的最后一天你想做点啥
  19. Spring源码阅读(一)——整体结构
  20. 视频教程-C#Winform水晶报表实例教程-C#

热门文章

  1. opencv下载安装及介绍【初学,后续继续更新】
  2. Transformer用到3D点云分割
  3. 将keras的h5模型转化为onnx
  4. sql 精读(一)标准 SQL 中的分析函数概念
  5. curl 下载 dropbox
  6. pandas 指定某一列的数据类型
  7. python 面向对象 (一)
  8. NTU 课程笔记 CE7454作业(1):DeepFashion属性预测挑战【介绍篇】
  9. chapter14 机器学习之利用SVD简化数据
  10. python function函数_Python34-06-函数(function)