第16編elasticsearch集約データ分析に深く入り込む
33780 ワード
1.bucketとmetricの2つのコア概念
単語の意味は理解できます:bucket:バケツは私たちのデータをグループ化します;sqlではgroup by user_に相当するid
metric:メトリック基準は、1つのデータパケットに対して実行される何らかの集約分析の操作であり、例えば平均値を求め、最大値を求め、最小値を求める.
2、家電量販店のケース背景
一つの家電量販店におけるテレビの販売データを背景に、さまざまなブランド、さまざまな色のテレビの販売量と売上高について、さまざまな角度から分析しています.
//データのセットを追加する:
3、どの色のポイントが一番売れているかを集計する
検索結果:
4、実戦bucket+metric:各色テレビの平均価格を統計する
5、bucketネストによる色+ブランドの多層ドリルダウン分析
色からブランドまでドリルダウン分析を行い、各色の平均価格、および各色の各ブランドの平均価格(グループ化の場合、グループ化)を見つけます.
6、より多くのmetricsを掌握する:各色テレビの最大最小平均総価格を統計する
count:bucket,terms,自動的にdoc_がありますcount,相当于count avg:avg aggs,求平均値max:求一个bucket内,指定field値最大的那データmin:求一个bucket内,指定field値最小的那データsum:求一个bucket内,指定field値の総和
7、実戦histogramは価格区間によってテレビの販売量と売上高を統計する
histogram:termsと同様にbucketパケット操作を行う.違いは、fieldを受信し、このfieldの値の各範囲区間に従ってbucketパケット操作bucket分割を行う方法、termsは、fieldの値が同じデータを1つのbucketに分割することである.
8、実戦データhitogramの統計毎月のテレビ販売量
date histogram:私たちが指定したdateタイプの日付fieldと日付intervalに従って、一定の日付間隔でbucket min_を区分します.doc_count:ある日付intervalでも、2017-01-01~2017-01-31でデータが1つもない場合、この区間は返されます.そうしないと、デフォルトではこの区間のextended_がフィルタされます.bounds,min,max:bucketを区切るときは、この開始日と締め切り日に限定されます
9、ドリルダウン分析の統計四半期ごとのブランドごとの売上高
10、検索+集約:指定ブランドの下で各色の販売量を統計する
11、global bucket:単一ブランドとすべてのブランドの販売量の対比
Aggregation、scopeの集約操作は、queryの検索結果の範囲内で実行する必要があります.すべてのデータを集約する必要がある場合があります.global:global bucketです.これまでのqueryにかかわらず、すべてのデータを集約scopeに組み込むことです.
12、フィルタ+集約:統計価格が1200より大きいテレビの平均価格
13、bucket filter:ブランドの最近一ヶ月の平均価格を統計する
14、並べ替え:各色の平均売上高の昇順で並べ替える
15、色+ブランドのドリルダウン分析時に最深層metricでソートする
16、易並列重合アルゴリズム、近似重合アルゴリズム、三角選択原則
パラレル集約アルゴリズム:maxなどの集約アルゴリズムは簡単に並列できます.shardごとに1万件のデータがある可能性があります.その後、この1万件のデータからmax値を抽出し、これらのshardから取り出した値をcoordinate nodeに置いて最大のmax値をフィルタします.近似集約アルゴリズム:count(distinc)の重量除去数などのアルゴリズムがあり、データが多くなります.この場合esは近似集約の方法を採用します.nodeごとに近似推定を行う方法で最終的な結論を得ます.性能は向上しますが、5%程度の誤差があります.三角選択の原則:正確+リアルタイム+ビッグデータ->2つを選択します.
(1)精確+リアルタイム:ビッグデータがなくて、データ量がとても小さくて、それでは普通は単機で走って、勝手にあなたがどのように遊ぶことができます(2)精確+ビッグデータ:hadoop、バッチ処理、非リアルタイム、大量のデータを処理することができて、精確を保証して、数時間(3)ビッグデータ+リアルタイム:esを走ることができて、精確ではありませんて、近似して推定して、何パーセントの誤り率があるかもしれません
17、cardinalityのデリバリーアルゴリズム及び毎月の販売ブランド数量統計
Esデマルチプレクシング:cardinality metricは、各bucketの指定されたfieldをデマルチプレクシングし、count(distinct)と同様にデマルチプレクシングします.
18.cardinalityアルゴリズムの最適化メモリオーバーヘッド及びHLLアルゴリズム
上記cardinalityはcount(distinct)に相当し、5%のエラー率があり、性能は100 ms程度precision_threshold最適化精度とメモリオーバーヘッド
19、percentilesパーセンテージアルゴリズムおよびWebサイトアクセス遅延統計
需要:たとえば、要求されるたびにアクセスする時間を記録するサイトがあり、tp 50、tp 90、tp 99を統計する必要があります.
tp 50:50%のリクエストの消費時間が最長でどれくらいの時間tp 90:90%のリクエストの消費時間が最長でどれくらいの時間tp 99:99%のリクエストの消費時間が最長でどれくらいの時間
次にクエリを行います.
単語の意味は理解できます:bucket:バケツは私たちのデータをグループ化します;sqlではgroup by user_に相当するid
metric:メトリック基準は、1つのデータパケットに対して実行される何らかの集約分析の操作であり、例えば平均値を求め、最大値を求め、最小値を求める.
2、家電量販店のケース背景
一つの家電量販店におけるテレビの販売データを背景に、さまざまなブランド、さまざまな色のテレビの販売量と売上高について、さまざまな角度から分析しています.
//データのセットを追加する:
PUT /tvs
{
"mappings": {
"sales": {
"properties": {
"price": {
"type": "long"
},
"color": {
"type": "keyword"
},
"brand": {
"type": "keyword"
},
"sold_date": {
"type": "date"
}
}
}
}
}
POST /tvs/sales/_bulk
{ "index": {}}
{ "price" : 1000, "color" : " ", "brand" : " ", "sold_date" : "2016-10-28" }
{ "index": {}}
{ "price" : 2000, "color" : " ", "brand" : " ", "sold_date" : "2016-11-05" }
{ "index": {}}
{ "price" : 3000, "color" : " ", "brand" : " ", "sold_date" : "2016-05-18" }
{ "index": {}}
{ "price" : 1500, "color" : " ", "brand" : "TCL", "sold_date" : "2016-07-02" }
{ "index": {}}
{ "price" : 1200, "color" : " ", "brand" : "TCL", "sold_date" : "2016-08-19" }
{ "index": {}}
{ "price" : 2000, "color" : " ", "brand" : " ", "sold_date" : "2016-11-05" }
{ "index": {}}
{ "price" : 8000, "color" : " ", "brand" : " ", "sold_date" : "2017-01-01" }
{ "index": {}}
{ "price" : 2500, "color" : " ", "brand" : " ", "sold_date" : "2017-02-12" }
3、どの色のポイントが一番売れているかを集計する
GET /tvs/sales/_search
{
"size" : 0,
"aggs" : {
"popular_colors" : {
"terms" : {
"field" : "color"
}
}
}
}
size: ,
aggs: ,
popular_colors: aggs, , , ok
terms:
field:
検索結果:
{
"took": 61,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 8,
"max_score": 0,
"hits": []
},
"aggregations": {
"popular_color": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": " ",
"doc_count": 4
},
{
"key": " ",
"doc_count": 2
},
{
"key": " ",
"doc_count": 2
}
]
}
}
}
hits.hits: size 0, hits.hits ,
aggregations:
popular_color:
buckets: field buckets
key: bucket
doc_count: bucket ,
,
bucket
: doc_count
4、実戦bucket+metric:各色テレビの平均価格を統計する
GET /tvs/sales/_search
{
"size": 0,
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
aggs bucket (terms), json , aggs, aggs , , metric ,avg, bucket field:price field,
metric, bucket , bucket metric
5、bucketネストによる色+ブランドの多層ドリルダウン分析
色からブランドまでドリルダウン分析を行い、各色の平均価格、および各色の各ブランドの平均価格(グループ化の場合、グループ化)を見つけます.
GET /tvs/sales/_search
{
"size": 0,
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"color_avg_price": {
"avg": {
"field": "price"
}
},
"group_by_brank":{
"terms": {
"field": "brand"
},
"aggs": {
"brand_avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
}
}
6、より多くのmetricsを掌握する:各色テレビの最大最小平均総価格を統計する
count:bucket,terms,自動的にdoc_がありますcount,相当于count avg:avg aggs,求平均値max:求一个bucket内,指定field値最大的那データmin:求一个bucket内,指定field値最小的那データsum:求一个bucket内,指定field値の総和
GET /tvs/sales/_search
{
"size" : 0,
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": { "avg": { "field": "price" } },
"min_price" : { "min": { "field": "price"} },
"max_price" : { "max": { "field": "price"} },
"sum_price" : { "sum": { "field": "price" } }
}
}
}
}
7、実戦histogramは価格区間によってテレビの販売量と売上高を統計する
histogram:termsと同様にbucketパケット操作を行う.違いは、fieldを受信し、このfieldの値の各範囲区間に従ってbucketパケット操作bucket分割を行う方法、termsは、fieldの値が同じデータを1つのbucketに分割することである.
GET /tvs/sales/_search
{
"size" : 0,
"aggs":{
"price":{
"histogram":{
"field": "price",
"interval": 2000
},
"aggs":{
"revenue": {
"sum": {
"field" : "price"
}
}
}
}
}
}
interval:2000, :0~2000,2000~4000,4000~6000,6000~8000,8000~10000,buckets
8、実戦データhitogramの統計毎月のテレビ販売量
date histogram:私たちが指定したdateタイプの日付fieldと日付intervalに従って、一定の日付間隔でbucket min_を区分します.doc_count:ある日付intervalでも、2017-01-01~2017-01-31でデータが1つもない場合、この区間は返されます.そうしないと、デフォルトではこの区間のextended_がフィルタされます.bounds,min,max:bucketを区切るときは、この開始日と締め切り日に限定されます
GET /tvs/sales/_search
{
"size" : 0,
"aggs": {
"sales": {
"date_histogram": {
"field": "sold_date",
"interval": "month",
"format": "yyyy-MM-dd",
"min_doc_count" : 0,
"extended_bounds" : {
"min" : "2016-01-01",
"max" : "2017-12-31"
}
}
}
}
}
9、ドリルダウン分析の統計四半期ごとのブランドごとの売上高
GET /tvs/sales/_search
{
"size": 0,
"aggs": {
"group_by_sold_date": {
"date_histogram": {
"field": "sold_date",
"interval": "quarter",
"format": "yyyy-MM-dd",
"min_doc_count": 0,
"extended_bounds": {
"min": "2016-01-01",
"max": "2017-12-31"
}
},
"aggs": {
"group_by_brand": {
"terms": {
"field": "brand"
},
"aggs": {
"sum_price": {
"sum": {
"field": "price"
}
}
}
},
"total_sum_price": {
"sum": {
"field": "price"
}
}
}
}
}
}
10、検索+集約:指定ブランドの下で各色の販売量を統計する
GET /tvs/sales/_search
{
"size": 0,
"query": {
"term": {
"brand": {
"value": " "
}
}
},
"aggs": {
"group_by_color": {
"terms": {
"field": "color"
}
}
}
}
11、global bucket:単一ブランドとすべてのブランドの販売量の対比
Aggregation、scopeの集約操作は、queryの検索結果の範囲内で実行する必要があります.すべてのデータを集約する必要がある場合があります.global:global bucketです.これまでのqueryにかかわらず、すべてのデータを集約scopeに組み込むことです.
GET /tvs/sales/_search
{
"size": 0,
"query": {
"term": {
"brand": {
"value": " "
}
}
},
"aggs": {
"single_brand_avg_price": {
"avg": {
"field": "price"
}
},
"all": {
"global": {},
"aggs": {
"all_brand_avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
12、フィルタ+集約:統計価格が1200より大きいテレビの平均価格
GET /tvs/sales/_search
{
"size": 0,
"query": {
"constant_score": {
"filter": {
"range": {
"price": {
"gte": 1200
}
}
}
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
13、bucket filter:ブランドの最近一ヶ月の平均価格を統計する
GET /tvs/sales/_search
{
"size": 0,
"query": {
"term": {
"brand": {
"value": " "
}
}
},
"aggs": {
"recent_30d": {
"filter": {
"range": {
"sold_date": {
"gte": "now-30d"
}
}
},
"aggs": {
"recent_150d_avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
14、並べ替え:各色の平均売上高の昇順で並べ替える
GET /tvs/sales/_search
{
"size": 0,
"aggs": {
"group_by_color": {
"terms": {
"field": "color",
"order": {
"avg_price": "asc"
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
15、色+ブランドのドリルダウン分析時に最深層metricでソートする
GET /tvs/sales/_search
{
"size": 0,
"aggs": {
"group_by_color": {
"terms": {
"field": "color"
},
"aggs": {
"group_by_brand": {
"terms": {
"field": "brand",
"order": {
"avg_price": "desc"
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
}
}
16、易並列重合アルゴリズム、近似重合アルゴリズム、三角選択原則
パラレル集約アルゴリズム:maxなどの集約アルゴリズムは簡単に並列できます.shardごとに1万件のデータがある可能性があります.その後、この1万件のデータからmax値を抽出し、これらのshardから取り出した値をcoordinate nodeに置いて最大のmax値をフィルタします.近似集約アルゴリズム:count(distinc)の重量除去数などのアルゴリズムがあり、データが多くなります.この場合esは近似集約の方法を採用します.nodeごとに近似推定を行う方法で最終的な結論を得ます.性能は向上しますが、5%程度の誤差があります.三角選択の原則:正確+リアルタイム+ビッグデータ->2つを選択します.
(1)精確+リアルタイム:ビッグデータがなくて、データ量がとても小さくて、それでは普通は単機で走って、勝手にあなたがどのように遊ぶことができます(2)精確+ビッグデータ:hadoop、バッチ処理、非リアルタイム、大量のデータを処理することができて、精確を保証して、数時間(3)ビッグデータ+リアルタイム:esを走ることができて、精確ではありませんて、近似して推定して、何パーセントの誤り率があるかもしれません
17、cardinalityのデリバリーアルゴリズム及び毎月の販売ブランド数量統計
Esデマルチプレクシング:cardinality metricは、各bucketの指定されたfieldをデマルチプレクシングし、count(distinct)と同様にデマルチプレクシングします.
GET /tvs/sales/_search
{
"size" : 0,
"aggs" : {
"months" : {
"date_histogram": {
"field": "sold_date",
"interval": "month"
},
"aggs": {
"distinct_colors" : {
"cardinality" : {
"field" : "brand"
}
}
}
}
}
}
18.cardinalityアルゴリズムの最適化メモリオーバーヘッド及びHLLアルゴリズム
上記cardinalityはcount(distinct)に相当し、5%のエラー率があり、性能は100 ms程度precision_threshold最適化精度とメモリオーバーヘッド
GET /tvs/sales/_search
{
"size" : 0,
"aggs" : {
"distinct_brand" : {
"cardinality" : {
"field" : "brand",
"precision_threshold" : 100
}
}
}
}
brand , brand unique value, 100 ,cardinality, 100%
cardinality , precision_threshold * 8 byte ,100 * 8 = 800
19、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_percentiles": {
"percentiles": {
"field": "latency",
"percents": [
50,
95,
99
]
}
},
"latency_avg": {
"avg": {
"field": "latency"
}
}
}
}