美文网首页ElasticSearch实战笔记
33、 三角选择原则与近似聚合算法,cardinality去重算

33、 三角选择原则与近似聚合算法,cardinality去重算

作者: 众神开挂 | 来源:发表于2020-04-17 10:35 被阅读0次

主要内容:三角选择原则与近似聚合算法,cardinality去重算法,percentiles百分比算法

1、三角选择原则与近似聚合算法

1、易并行聚合算法:max

有些聚合分析的算法,是很容易就可以并行的,比如说max

不易并行的算法:distinct

有些聚合分析的算法,是不好并行的,比如说,count(distinct),并不是说,在每个node上,直接就出一些distinct value,就可以的,因为数据可能会很多

es会采取近似聚合的方式,就是采用在每个node上进行近估计的方式,得到最终的结论,cuont(distcint),100万,1050万/95万 --> 5%左右的错误率
近似估计后的结果,不完全准确,但是速度会很快,一般会达到完全精准的算法的性能的数十倍

2、三角选择原则

精准+实时+大数据 --> 选择2个

(1)精准+实时: 没有大数据,数据量很小,那么一般就是单击跑,随便你则么玩儿就可以
(2)精准+大数据:hadoop,批处理,非实时,可以处理海量数据,保证精准,可能会跑几个小时
(3)大数据+实时:es,不精准,近似估计,可能会有百分之几的错误率

3、近似聚合算法

如果采取近似估计的算法:延时在100ms左右,0.5%错误
如果采取100%精准的算法:延时一般在5s~几十s,甚至几十分钟,几小时, 0%错误

2、cardinality去重算法

ES去重,cartinality metric,对每个bucket中的指定的field进行去重,取去重后的count,类似于count(distcint)

GET /tvs/_search
{
  "size" : 0,
  "aggs" : {
      "months" : {
        "date_histogram": {
          "field": "sold_date",
          "calendar_interval": "month"
        },
        "aggs": {
          "distinct_brands" : {  
              "cardinality" : {
                "field" : "brand"   ##对品牌字段去重,统计每月销售的品牌数量
              }
          }
        }
      }
  }
}

3、cardinality算法之优化内存开销以及HLL算法

cardinality,5%的错误率,性能在100ms左右

3.1、precision_threshold优化准确率和内存开销
GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "distinct_brand": {
      "cardinality": {
        "field": "brand",
        "precision_threshold": 100
      }
    }
  }
}

cardinality算法,会占用precision_threshold * 8 byte 内存消耗,100 * 8 = 800个字节,占用内存很小。
而且unique value如果的确在precision_threshold 的值以内,那么可以确保100%准确。
当precision_threshold=100时,数百万的unique value,错误率在5%以内

precision_threshold,值设置的越大,占用内存越大,可以确保更多unique value的场景下,100%的准确

3.2、HyperLogLog++ (HLL)算法性能优化

cardinality底层算法:HLL算法,HLL算法的性能

会对所有的uqniue value取hash值,通过hash值近似去求distcint count,误差

默认情况下,发送一个cardinality请求的时候,会动态地对所有的field value,取hash值; 将取hash值的操作,前移到建立索引的时候

PUT /tvs2   
{
  "mappings": {
    "properties": {
      "brand": {
        "type": "text",
        "fields": {
          "hash": {
            "type": "murmur3"   ##报错 no handler for type [murmur3] declared on field [hash]
          }
        }
      }
    }
  }
}
GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "distinct_brand": {
      "cardinality": {
        "field": "brand.hash",
        "precision_threshold": 100
      }
    }
  }
}

4、percentiles百分比算法以及网站访问时延统计

需求:比如有一个网站,记录下了每次请求的访问的耗时,需要统计tp50,tp90,tp99

tp50:50%的请求的耗时最长在多长时间
tp90:90%的请求的耗时最长在多长时间
tp99:99%的请求的耗时最长在多长时间

搭建舞台:

PUT /website
{
  "mappings": {
    "properties": {
      "latency": {
        "type": "long"
      },
      "province": {
        "type": "keyword"
      },
      "timestamp": {
        "type": "date"
      }
    }
  }
}

POST /website/_bulk
{ "index": {}}
{ "latency" : 105, "province" : "江苏", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 83, "province" : "江苏", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 92, "province" : "江苏", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 112, "province" : "江苏", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 68, "province" : "江苏", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 76, "province" : "江苏", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 101, "province" : "新疆", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 275, "province" : "新疆", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 166, "province" : "新疆", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 654, "province" : "新疆", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 389, "province" : "新疆", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 302, "province" : "新疆", "timestamp" : "2016-10-29" }

percentiles查询01:

GET /website/_search 
{
  "size": 0,
  "aggs": {
    "latency_percentiles": {
      "percentiles": {      ##  percentiles查询
        "field": "latency",  
        "percents": [
          50,
          95,
          99
        ]
      }
    },
    "latency_avg": {
      "avg": {
        "field": "latency"  ## 查询平均时延
      }
    }
  }
}

50%的请求,数值的最大的值是多少,不是完全准确的

percentiles查询02:

GET /website/_search
{
  "size": 0,
  "aggs": {
    "group_by_province": {
      "terms": {
        "field": "province" ##对省进行分组
      },
      "aggs": {
        "latency_percentiles": {
          "percentiles": {
            "field": "latency",
            "percents": [
              50,
              95,
              99
            ]
          }
        },
        "latency_avg": {
          "avg": {
            "field": "latency"
          }
        }
      }
    }
  }
}

5、percentile ranks metric

我们的网站的提供的访问延时的SLA,确保所有的请求100%,都必须在200ms以内.

需求:在200ms以内的,有百分之多少,在1000毫秒以内的有百分之多少,

这个percentile ranks,其实比pencentile还要常用

比如:按照品牌分组,计算,电视机,售价在1000的占比,2000的占比,3000的占比

查询实战

GET /website/_search
{
  "size": 0,
  "aggs": {
    "group_by_province": {
      "terms": {
        "field": "province"
      },
      "aggs": {
        "latency_percentile_ranks": {
          "percentile_ranks": {
            "field": "latency",
            "values": [
              200,
              1000
            ]
          }
        }
      }
    }
  }
}

相关文章

网友评论

    本文标题:33、 三角选择原则与近似聚合算法,cardinality去重算

    本文链接:https://www.haomeiwen.com/subject/zhkumhtx.html