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学习之深入聚合分析四---案例实战的更多相关文章

  1. Elasticsearch学习之深入聚合分析三---案例实战

    1. 统计指定品牌下每个颜色的销量 任何的聚合,都必须在搜索出来的结果数据中进行,搜索结果,就是聚合分析操作的scope GET /tvs/sales/_search { , "query& ...

  2. Elasticsearch学习之深入聚合分析二---案例实战

    以一个家电卖场中的电视销售数据为背景,来对各种品牌,各种颜色的电视的销量和销售额,进行各种各样角度的分析,首先建立电视销售的索引,然后 添加几条销售记录 PUT /tvs { "mappin ...

  3. Elasticsearch学习之深入聚合分析五---案例实战

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

  4. Elasticsearch学习之深入聚合分析一---基本概念

    首先明白两个核心概念:bucket和metric 1. bucket:一个数据分组 city name 北京 小李 北京 小王 上海 小张 上海 小丽 上海 小陈 基于city划分buckets,划分 ...

  5. ElasticStack学习(八):ElasticSearch索引模板与聚合分析初探

    一.Index Template与Dynamic Template的概念 1.Index Template:它是用来根据提前设定的Mappings和Settings,并按照一定的规则,自动匹配到新创建 ...

  6. elasticsearch系列六:聚合分析(聚合分析简介、指标聚合、桶聚合)

    一.聚合分析简介 1. ES聚合分析是什么? 聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值.最小值,计算和.平均值等.ES作为 ...

  7. ElasticSearch 简单的 搜索 聚合 分析

    一. 搜索1.DSL搜索 全部数据没有任何条件 GET /shop/goods/_search { "query": { "match_all": {} } } ...

  8. Elasticsearch学习之嵌套聚合,下钻分析,聚合分析

    1. 计算每个tag下的商品数量 GET /ecommerce/product/_search { "aggs": { "group_by_tags": { & ...

  9. Elasticsearch 6.x版本全文检索学习之聚合分析入门

    1.什么是聚合分析? 答:聚合分析,英文为Aggregation,是es除搜索功能外提供的针对es数据做统计分析的功能.特点如下所示: a.功能丰富,提供Bucket.Metric.Pipeline等 ...

随机推荐

  1. 分享9款最新超酷HTML5/CSS3应用插件

    新的一周开始了,小编继续要为大家分享实用超酷的HTML5应用,今天分享的这9款最新HTML5/CSS3应用你一定会很喜欢,一起来看看. 1.HTML5 Canvas模拟衣服撕扯动画 超级逼真 今天又要 ...

  2. itext汇总 生成pdf

    https://www.cnblogs.com/xiaoSY-learning/p/5805577.html

  3. asp.net操作cookie类,包含datatable批量存入cookie

    以下是类: public class CookieMgr { #region 快速储存Cookie /// <summary> /// 快速储存Cookie /// </summar ...

  4. jmeter jdbc request 如何运行多个sql

    database url:jdbc:mysql://127.0.0.1:3306/api?useUnicode=true&allowMultiQueries=true&characte ...

  5. Oracle:oracle 12.1.0.2 升级到12.2.0.1 后,自动任务报错:ORA-20001: Statistics Advisor: Invalid task name for the current user

    具体错误如下:关键字:ORA-12012.ORA-20001 ORA-12012: error on auto execute of job "SYS"."ORA$AT_ ...

  6. redhat enterprise edition 6.8:禁止ipv6后,nfs文件系统无法挂载:no such device

    如题:谨记. 附注:如何禁止ipv6? 方法一 第一种方法是通过 /etc/sysctl.conf 文件对 /proc 进行永久修改. 换句话说,就是用文本编辑器打开 /etc/sysctl.conf ...

  7. jenkins 启动slave,出现com.sun.deploy.net.FailedDownloadException: Unable to load resource: http://127.0.0.1:8080/jnlpJars/remoting.jar

    master: linux slave: win7 64位系统 在配置好系统后,采用jnlp的方式启动slave节点,报错如下: com.sun.deploy.net.FailedDownloadEx ...

  8. Vim终极指南:所思即所得

    https://blog.csdn.net/dc_726/article/details/78981756

  9. node.js模块依赖及版本号

    摘要: Node.js最重要的一个文件就是package.json,其中的配置参数决定了功能.例如下面就是一个例子 { "name": "test", &quo ...

  10. python 中dir()和__dict__的区别

    Python __dict__与dir() 出处(http://blog.csdn.net/lis_12/article/details/53521554). Python下一切皆对象,每个对象都有多 ...