Elastic searchにおける並列重合アルゴリズム,三角選択原則,近似重合アルゴリズムの浅い分析

6888 ワード

1、いくつかの集約分析のアルゴリズムは、簡単に並列することができます.例えばmax
いくつかの集約分析のアルゴリズムは、並列にはできません.例えば、count(distinct)は、nodeごとにdistinct valueを直接出せばいいわけではありません.データが多い可能性があるからです.
Esは近似重合方式を採用し、nodeごとに近似推定を行う方式を採用し、最終的な結論を得る.cuont(distcint)は、5%程度の誤り率がある可能性があり、近似推定後の結果は、完全に正確ではないが、速度は速く、一般的に完全に正確なアルゴリズムの性能の数十倍に達する.
2、三角選択の原則
精確+リアルタイム+ビッグデータ-->2個選択
(1)精確+リアルタイム:ビッグデータがなく、データ量が小さく、普通は単機で走る.(2)精確+ビッグデータ:hadoop、バッチ処理、非リアルタイム、大量のデータを処理することができ、精確を保証し、数時間走る可能性がある.(3)ビッグデータ+リアルタイム:es、不正確、近似推定、数パーセントの誤り率がある可能性がある;
3、近似集約アルゴリズム
近似推定アルゴリズムを採用すれば、遅延は100 ms程度で、0.5%エラーである.100%正確なアルゴリズムを採用すれば、遅延は一般的に5 s~数十s、甚だしきに至っては数十分、数時間であるが、0%の誤りである.
4、esでの再操作;
cartinality metricを使用して、各bucketで指定されたfieldをデポジットし、デポジット後のcountをcount(distcint)と同様に取ります.
GET /tvs/sales/_search
{
  "size" : 0,
  "aggs" : {
      "months" : {
        "date_histogram": {
          "field": "sold_date",
          "interval": "month"
        },
        "aggs": {
          "distinct_colors" : {
              "cardinality" : {
                "field" : "brand"
              }
          }
        }
      }
  }
}

5、cardinality,count(distinct)、5%の誤り率、性能は100 ms程度
利用precision_threshold最適化精度とメモリオーバーヘッド
GET /tvs/sales/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_brand" : {
            "cardinality" : {
              "field" : "brand",
              "precision_threshold" : 100 
            }
        }
    }
}

どれくらいのpricision_threshold個unique value以内、cardinality、ほぼ100%正確を保証、cardinalityアルゴリズム、precision_を占有するthreshold*8 byteメモリ消費量、100*8=800バイト、メモリ消費量が小さい...またunique valueが確かに値以内であれば,100%正確100,数百万のunique value,誤り率5%以内を確保できる.
2、HyperLogLog++(HLL)アルゴリズム性能最適化
cardinality下位アルゴリズム:HLLアルゴリズム、HLLアルゴリズムの性能
すべてのuqniue valueに対してhash値を取って、hash値の近似を通じてdistcint countを求めて、誤差
デフォルトでは、cardinalityリクエストを送信すると、すべてのfield valueに対してhash値が動的に取得されます.hash値を取る操作をインデックスが作成されるまで前に移動します.
PUT /tvs/
{
  "mappings": {
    "sales": {
      "properties": {
        "brand": {
          "type": "text",
          "fields": {
            "hash": {
              "type": "murmur3" 
            }
          }
        }
      }
    }
  }
}

GET /tvs/sales/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_brand" : {
            "cardinality" : {
              "field" : "brand.hash",
              "precision_threshold" : 100 
            }
        }
    }
}

3、_percentilesパーセントアルゴリズムおよびWebサイトアクセス遅延統計
リクエストされるたびのアクセス時間を記録したサイトがあり、tp 50,tp 90,tp 99を統計する必要があります.
tp 50:50%のリクエストの消費時間が最長でどれくらいの時間tp 90:90%のリクエストの消費時間が最長でどれくらいの時間tp 99:99%のリクエストの消費時間が最長でどれくらいの時間
PUT /website
{
  "mappings": {
    "logs":{
      "properties":{
        "latency":{
          "type":"long"
        },
        "province":{
          "type":"keyword"
        },
        "timestamp":{
          "type":"date"
        }
      }
    }
  }
}

POST /website/logs/_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" }


GET /website/logs/_search
{
  "size": 0, 
  "aggs": {
    "latency_properties": {
      "percentiles": {
        "field": "latency",
        "percents": [
          50,
          95,
          99
        ]
      }
    },
    "latency_avg":{
      "avg": {
        "field": "latency"
      }
    }
  }
}

各省のtp 50,tp 90,tp 99を統一する
GET /website/logs/_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"
          }
        }
      }
    }
  }
}

4、_percentiles rankおよびWebサイトアクセス遅延SLA統計
需要:200 ms以内のもの、1000ミリ秒以内のもの、percentile ranks metric
需要:ブランドによってグループ分けして、計算して、テレビ、価格は1000で比を占めて、2000は比を占めて、3000は比を占めます
GET /website/logs/_search
{
  "size": 0,
  "aggs": {
    "group_by_province": {
      "terms": {
        "field": "province"
    },
    "aggs": {
      "latency_percentile_ranks": {
        "percentile_ranks": {
          "field": "latency",
          "values": [
            200,
            1000
          ]
        }
      }
    }
    }
  }
}

percentileの最適化:percentileはTDigestアルゴリズムを使用し、多くのノードでパーセンテージの計算を実行し、近似推定、誤差があり、ノードが多ければ多いほど正確になる.
パラメータcompressionを使用して、ノードの数を制限することができます最大compression*20=2000個のnodeを計算して、デフォルトの100、数が大きいほど、メモリの使用量が多くなり、正確であればあるほど、性能が悪くなり、1つのノードは32バイトを使用して、100*20*32=64 KBを使用して、percentileアルゴリズムが正確であればあるほど、compressionは設定することができます.