Elasticsearch学习之深入聚合分析四---案例实战
1. 需求:比如有一个网站,记录下了每次请求的访问的耗时,需要统计tp50,tp90,tp99
tp50:50%的请求的耗时最长在多长时间
tp90:90%的请求的耗时最长在多长时间
tp99:99%的请求的耗时最长在多长时间
PUT /website
{
"mappings": {
"logs": {
"properties": {
"latency": {
"type": "long"
},
"province": {
"type": "keyword"
},
"timestamp": {
"type": "date"
}
}
}
}
} POST /website/logs/_bulk
{ "index": {}}
{ "latency" : , "province" : "江苏", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : , "province" : "江苏", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : , "province" : "江苏", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : , "province" : "江苏", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : , "province" : "江苏", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : , "province" : "江苏", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : , "province" : "新疆", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : , "province" : "新疆", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : , "province" : "新疆", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : , "province" : "新疆", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : , "province" : "新疆", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : , "province" : "新疆", "timestamp" : "2016-10-29" }
创建索引并添加数据
可以采用pencentiles语法,示例:
GET /website/logs/_search
{
"size": ,
"aggs": {
"latency_percentiles": {
"percentiles": {
"field": "latency",
"percents": [
,
, ]
}
},
"latency_avg": {
"avg": {
"field": "latency"
}
}
}
}
2. SLA:就是你提供的服务的标准
我们的网站的提供的访问延时的SLA,确保所有的请求100%,都必须在200ms以内,大公司内,一般都是要求100%在200ms以内
如果超过1s,则需要升级到A级故障,代表网站的访问性能和用户体验急剧下降
需求:在200ms以内的,有百分之多少,在1000毫秒以内的有百分之多少,percentile ranks metric
这个percentile ranks,其实比pencentile还要常用,例如,可以按照品牌分组,计算,电视机,售价在1000占比,2000占比,3000占比
GET /website/logs/_search
{
"size": ,
"aggs": {
"group_by_province": {
"terms": {
"field": "province"
},
"aggs": {
"latency_percentile_ranks": {
"percentile_ranks": {
"field": "latency",
"values": [
, ]
}
}
}
}
}
}
percentile采用TDigest算法,利用很多节点来执行百分比的计算,近似估计,有误差,节点越多,越精准
compression,可以限制节点数量,最多 compression * 20 = 2000个node去计算
默认 100 ,数量越大占用内存越多,但是结果越精准,性能越差,一个节点占用32字节,100 * 20 * 32 = 64KB,如果想要percentile算法越精准,compression可以设置的越大
3. 聚合分析的内部原理
采用倒排索引+正排索引(doc value)实现,在PUT/POST的时候,就会生成doc value数据,也就是正排索引,正排索引也会写入磁盘文件中,然后os cache先进行缓存,以提升访问doc value正排索引的性能,如果os cache内存大小不足够放得下整个正排索引,就会将doc value的数据写入磁盘文件中,es官方是建议,es大量是基于os cache来进行缓存和提升性能的,不建议用jvm内存来进行缓存,那样会导致一定的gc开销和oom问题给jvm更少的内存,给os cache更大的内存64g服务器,给jvm最多16g,几十个g的内存给os cache,os cache可以提升doc value和倒排索引的缓存和查询效率
4.对分析的字段进行聚合
对分词的field,直接执行聚合操作,会报错,大概意思是说,你必须要打开fielddata,然后将正排索引数据加载到内存中,才可以对分词的field执行聚合操作,而且会消耗很大的内存
POST /test_index/_mapping/test_type
{
"properties": {
"test_field": {
"type": "text",
"fielddata": true
}
}
}
如果要对分词的field执行聚合操作,必须将fielddata设置为true
5. 分词field+fielddata的工作原理
对不分词的所有field,可以执行聚合操作,如果你的某个field不分词,那么在index-time,就会自动生成doc value,所以针对这些不分词的field执行聚合操作的时候,自动就会用doc value来执行,但是分词的field是没有doc value的,在index-time,如果某个field是分词的,那么是不会给它建立doc value正排索引的,因为分词后,占用的空间过于大,所以默认是不支持分词field进行聚合的,正因为分词field默认没有doc value,所以直接对分词field执行聚合操作,是会报错的
对于分词field,必须打开和使用fielddata,完全存在于纯内存中,结构和doc value类似,如果是ngram或者是大量term,那么必将占用大量的内存,如果一定要对分词的field执行聚合,那么必须将fielddata=true,然后es就会在执行聚合操作的时候,现场将field对应的数据,建立一份fielddata正排索引,fielddata正排索引的结构跟doc value是类似的,但是只会讲fielddata正排索引加载到内存中来,然后基于内存中的fielddata正排索引执行分词field的聚合操作
为什么fielddata必须在内存?因为分词的字符串按照term进行聚合,需要执行更加复杂的算法和操作,如果基于磁盘和os cache,那么性能会很差
Elasticsearch学习之深入聚合分析四---案例实战的更多相关文章
- Elasticsearch学习之深入聚合分析三---案例实战
1. 统计指定品牌下每个颜色的销量 任何的聚合,都必须在搜索出来的结果数据中进行,搜索结果,就是聚合分析操作的scope GET /tvs/sales/_search { , "query& ...
- Elasticsearch学习之深入聚合分析二---案例实战
以一个家电卖场中的电视销售数据为背景,来对各种品牌,各种颜色的电视的销量和销售额,进行各种各样角度的分析,首先建立电视销售的索引,然后 添加几条销售记录 PUT /tvs { "mappin ...
- Elasticsearch学习之深入聚合分析五---案例实战
1. fielddata核心原理 fielddata加载到内存的过程是lazy加载的,对一个analzyed field执行聚合时,才会加载,而且是field-level加载的,一个index的一个f ...
- Elasticsearch学习之深入聚合分析一---基本概念
首先明白两个核心概念:bucket和metric 1. bucket:一个数据分组 city name 北京 小李 北京 小王 上海 小张 上海 小丽 上海 小陈 基于city划分buckets,划分 ...
- ElasticStack学习(八):ElasticSearch索引模板与聚合分析初探
一.Index Template与Dynamic Template的概念 1.Index Template:它是用来根据提前设定的Mappings和Settings,并按照一定的规则,自动匹配到新创建 ...
- elasticsearch系列六:聚合分析(聚合分析简介、指标聚合、桶聚合)
一.聚合分析简介 1. ES聚合分析是什么? 聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值.最小值,计算和.平均值等.ES作为 ...
- ElasticSearch 简单的 搜索 聚合 分析
一. 搜索1.DSL搜索 全部数据没有任何条件 GET /shop/goods/_search { "query": { "match_all": {} } } ...
- Elasticsearch学习之嵌套聚合,下钻分析,聚合分析
1. 计算每个tag下的商品数量 GET /ecommerce/product/_search { "aggs": { "group_by_tags": { & ...
- Elasticsearch 6.x版本全文检索学习之聚合分析入门
1.什么是聚合分析? 答:聚合分析,英文为Aggregation,是es除搜索功能外提供的针对es数据做统计分析的功能.特点如下所示: a.功能丰富,提供Bucket.Metric.Pipeline等 ...
随机推荐
- Console程序后台运行
[DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern IntPt ...
- 谈谈Android中的SurfaceTexture
2015.7.2更新 由于很多人要代码,我把代码下载链接放在这里了.不过还是要说一下,surfaceTexture和OpenGL ES结合才能发挥出它最大的效果,我这种写法只是我自己的想法,还有很多种 ...
- 安卓开发笔记——ListView加载性能优化ViewHolder
在前不久做安卓项目的时候,其中有个功能是爬取某网站上的新闻信息,用ListView展示,虽然做了分页,但还是觉得达不到理想流畅效果. 上网查阅了些资料,发现一些挺不错的总结,这里记录下,便于复习. 当 ...
- 【WP8】ScrollViewer滑动到底触发器(ListBox失效)
很多时候会有到底加载更多的需求,而ScrollViewer不支持继承,无法继承它进行扩展,只能通过触发器来控制到底的事件(当然,可以通过UserControl去扩展) 思路:定义一个Trigger,自 ...
- [转]十个 iOS 面试问题
原文地址:http://onevcat.com/2013/04/ios-interview/ 不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术问题环节不仅是企业对应聘 ...
- slab着色,可以减少cache conflict miss概率么?
以内部slab为例,管理区 + object总大小+left_over size = 1page,我们做个极端假设,cache为 direct-mapped caches. 1.没有采用slab着色: ...
- Android四大组件之——ContentProvider(二)
Content Resolver介绍: 开发者文档中这么定义的: This class provides applications access to the content model. 这个类为应 ...
- 如何在Datatable中取得每列的数据列宽度
你用SqlDataAdapter填充DataTable的时候不要用Fill方法而应该用FillSchema方法: using (SqlConnection conn = new SqlConnecti ...
- h5文件(.h5和.hdf5)
HDF5 (.h5, .hdf5) HDF 是 Hierarchical Data Format(分层数据格式)的缩写 HDF 版本 5不与 HDF 版本 4 及早期版本兼容. HDF5 (.h5, ...
- 源码分析五(HashSet的内部实现)
一:首先来看看Hashset的继承体系 public class HashSet<E> extends AbstractSet<E> implements Set<E&g ...