ElasticSearch はどのようにして TDigest アルゴリズムを使用して数十億のデータのパーセンタイルを計算するのでしょうか?

ElasticSearch はどのようにして TDigest アルゴリズムを使用して数十億のデータのパーセンタイルを計算するのでしょうか?

[[393929]]

この記事はWeChatの公開アカウント「プログラマー李小冰」から転載したもので、著者は李小冰です。この記事を転載する場合は、プログラマー Li Xiaobing の公式アカウントまでご連絡ください。

みなさんこんにちは。私は李小兵です。分散型オープンソース検索および分析エンジンである ElasticSearch は、全文一致検索だけでなく、集計分析も実行できます。

今日は、集計分析でよく使われるパーセンタイル分析について見てみましょう。 n 個のデータは数値に従って並べられ、p% の位置にある値は p パーセンタイルと呼ばれます。

たとえば、ElasticSearch は各 Web サイトへのアクセス要求にかかる時間を記録し、合計要求の 99% にかかる最長時間である TP99 を計算する必要があります。

近似アルゴリズム

データサイズが小さい場合や、データが同じ場所に集中的に保存されている場合は、TP99 のようなパーセンタイル分析を簡単に実行できます。

しかし、データ量が増え続けるにつれて、データの集計分析では、データ量、精度、リアルタイム パフォーマンスの間でトレードオフが必要になり、そのうち 2 つしか満たせなくなります。

上の図に示すように、3 つのオプションがあります。

  • 限られたデータ コンピューティング: 高精度とリアルタイムのパフォーマンスを選択すると、単一マシン データの MySQL 統計分析など、大量のデータを処理できなくなります。
  • オフライン コンピューティング: 大量のデータと高精度を選択すると、リアルタイム パフォーマンスが低下します。たとえば、Hadoop は PB レベルのデータに対して正確な分析を提供できますが、時間がかかる場合があります。
  • 概算計算:大容量データとリアルタイム性能を選択しますが、0.5% など、ある程度の精度は失われますが、比較的正確な分析結果が得られます。

Elasticsearch は現在、カーディナリティとパーセンタイルの 2 つの近似アルゴリズムをサポートしています。

カーディナリティは、フィールドのカーディナリティ、つまりフィールドの個別または一意の値の数を計算するために使用されます。カーディナリティは、HyperLogLog (HLL) アルゴリズムに基づいて実装されます。

HLL はまずデータに対してハッシュ演算を実行し、次にハッシュ演算結果のビット数に基づいて確率を推定して基数を取得します。 HLL アルゴリズムの詳細については、「Redis HyperLogLog 詳細説明」の記事をご覧ください。

そして、パーセンタイルこそがこの記事の焦点です。

パーセンタイル

ElasticSearch は、パーセンタイルを使用して、指定されたフィールドのパーセンタイルを分析できます。具体的なリクエストは次のとおりです。ログ インデックスの下のレイテンシ フィールドのパーセンタイルを分析します。つまり、Web サイト リクエストのレイテンシ パーセンタイルを計算します。

デフォルトでは、パーセンタイルは [1、5、25、50、75、95、99] という事前に設定されたパーセンタイル値のセットを返します。これらは、人々が関心を持つ一般的なパーセンタイル値を表し、範囲のどちらかの側に極端なパーセンタイルがあり、中間に他のパーセンタイルがあります。

具体的な戻り値は以下の図の通りです。最小遅延は約 75 ミリ秒ですが、最大遅延はほぼ 600 ミリ秒であることがわかります。対照的に、平均レイテンシは約 200 ミリ秒です。

前述の基数と同様に、パーセンタイルを計算するには近似アルゴリズムが必要です。

データ量が少ない場合、すべての値の順序付きリストをメモリ内に保持することで、さまざまなパーセンタイルを計算できますが、数十億のデータ ポイントが数十のノードに分散されている場合、このようなアルゴリズムは非現実的です。

したがって、パーセンタイルでは、さまざまな精度でさまざまなパーセンタイルを計算する近似アルゴリズムである TDigest アルゴリズムが使用されます。パーセンタイルの範囲が極端に広いほど、精度が高くなります。たとえば、1% または 99% のパーセンタイルは、50% のパーセンタイルよりも精度が高くなります。ほとんどの人は極端なパーセンタイルだけを気にするので、これは良い機能です。

TDigestアルゴリズム

TDigest は、ElastichSearch、Spark、Kylin などのシステムで使用される、シンプルで高速、高精度、並列化可能な近似パーセンタイル アルゴリズムです。 TDigest には 2 つの主要な実装アルゴリズムがあります。1 つはバッファ アンド マージ アルゴリズム、もう 1 つは AV L ツリー クラスタリング アルゴリズムです。

TDigest が使用するアイデアは、近似アルゴリズムでよく使用されるスケッチです。これは、私たちが日常的に描くスケッチのように、データの一部を使用してデータセット全体の特性を特徴付けます。実際のオブジェクトとの間にはギャップがありますが、実際のオブジェクトと非常によく似ており、実際のオブジェクトの特徴を示すことができます。

次に、TDigest の原理を紹介します。たとえば、-30 から 30 の間に 500 個の数字がある場合、確率密度関数 (PDF) を使用してこのデータ セットを表すことができます。

関数上の点の y 値は、その x 値がデータ セット全体に現れる確率です。関数全体の面積の合計はちょうど 1 です。これは、データ セット内のデータの分布を表していると言えます (誰もがよく知っている正規分布図は、この関数を示しています)。

データ セットに対応した PDF 関数を使用すると、データ セットのパーセンタイルも PDF 関数の領域で表現できます。下の図に示すように、75% パーセンタイルは、領域の 75% に対応する x 座標です。

PDF 関数曲線の点はデータセット内のデータに対応していることがわかっています。データ量が少ない場合は、データセット内のすべての点を使用して関数を計算できますが、データ量が多い場合は、少量のデータを使用してデータセット内のすべてのデータを置き換えることしかできません。

ここでは、データ セットをグループにグループ化し、平均と重みを使用してグループ番号を置き換える必要があります。これら 2 つの数値は総称して Centroid (重心数) と呼ばれ、この重心数を使用して PDF を計算します。これが TDigest アルゴリズムの核となる考え方です。

上図に示すように、重心数の平均値が x 値として使用され、重心の数が y 値として使用されます。このデータセットの PDF 関数は、この重心数のセットを介して大まかにプロットできます。

同様に、パーセンタイルを計算するには、これらの重心数から対応する位置の重心数を見つけるだけでよく、その平均値がパーセンタイル値になります。

当然のことながら、重心の値が大きいほど、表すデータが多くなり、失われる情報が多くなり、精度が低下します。上図に示すように、重心の数が多すぎると精度が低下し、重心の数が少なすぎるとメモリなどのリソースを大量に消費し、近似アルゴリズムの高いリアルタイム効果が得られません。

そのため、TDigest は、圧縮率に基づいて、各重心数で表されるデータ量をパーセンタイルに従って制御します (圧縮率が高いほど、重心数が表すデータが多くなります)。両側の重心数は小さく、より正確ですが、中央の重心数は大きくなります。これにより、1% または 99% パーセンタイルが 50% パーセンタイルよりも正確であるという上記の効果が得られます。

ソースコード分析

ElasticSearch は、TDigest のオープン ソース実装である t-digest を直接使用します。この github アドレスは https://github.com/tdunning/t-digest です。ElasticSearch の TDigestState クラスで t-digest 実装のカプセル化を確認できます。

t-digest は、TDigest アルゴリズムの 2 つの実装を提供します。

  • MergingDigestは、上記のバッファとマージのアルゴリズムに対応します。
  • AVLGroupTree は、AVL ツリーのクラスタリング アルゴリズムに対応します。

MergingDigest は、データ セットがソートされ、圧縮率に基づいて重心の数を直接計算できるシナリオで使用されますが、AVLGroupTree では、AVL ツリーを使用して、データの「近さ」に基づいて自信を持ってデータを判断し、重心の数を計算する必要があります。

MergingDigest の実装は比較的簡単です。名前が示すように、このアルゴリズムはバッファ アンド マージと呼ばれ、実装では tempWeight と tempMean という 2 つの配列を使用して重心配列を表します。データは保存された重心とマージされます。重量制限を超えると、新しい重心が作成されます。それ以外の場合は、現在の重心の平均値と数が変更されます。

MergingDigest と比較すると、AVLGroupTree には、AVL バイナリバランスツリーを通じて重心に最も近いデータを検索するという追加のステップがあります。最も近い重心を見つけた後、2 つがマージされ、重量制限を超えているかどうかが判断され、変更または作成操作が実行されます。

次に、AVLGroupTree の add メソッドを直接見てみましょう。

ElasticSearch はデータ セットを処理するときに、add 関数を呼び出してデータ セット内のデータを継続的に重心に追加し、統計が完了したら、その分位点を呼び出してパーセンタイルを計算します。

追記

皆様、引き続きプログラマー Li Xiaobing をフォローしてください。今後もデータの保存、データ分析、配信に関する記事をお届けしていきます。次の記事では、ElasticSearch の他の集計分析操作の実装原則について学習します。

<<:  グラフアルゴリズムシリーズ: 無向グラフのデータ構造

>>:  図解 Raft コンセンサス アルゴリズム: リーダーを選出する方法

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

商用顔認識は一時停止できるのか?

顔認証を防ぐために、市民は営業所を訪れる際にヘルメットをかぶっている。「初の顔認証事件」で、裁判所は...

通信ネットワークにおけるOSPFプロトコルの適用とアルゴリズムの最適化

3G通信技術は広く利用されており、4Gに向けてますます進化しています。通信ネットワーク内のアクセスス...

ロボット革命が都市のライフスタイルをどう変えるのか

[[378077]]すべてが自動化によって制御され、それが未来の産物だと考えられていた時代は過ぎ去り...

一般的なスマートカーの7つの技術についてお話ししましょう

ハイテク業界は常に進化しており、毎週新たな革命的な変化が起こっています。当然のことながら、関連するニ...

限定ダウンロード! Alibaba は AI をどのように活用してコードを記述しているのでしょうか?

[[315476]]今年のアリババ経済フロントエンド委員会の4つの主要な技術方向の1つとして、フロ...

AIを使用してC++、Java、Pythonコードを翻訳し、最大成功率は80.9%です。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

量子コンピューティングは今後10年間で物流業界を変えるだろう

近年、サプライチェーンおよび物流業界は、労働力不足から予測不可能な天候、需給の変化まで、ますます多く...

AIが産業変革を促進する仕組み

このように技術的に進歩した世界では、検査などの重要な産業プロセスは依然として非効率でコストがかかり、...

人工知能の3つの人生を10分で紹介します

AIは2016年以来最もホットなキーワードであり、それについてはさまざまな意見があります。バブルがは...

Google のロボット工学プログラムは度重なる失敗からどのような教訓を得たのでしょうか?

Google は再びロボットの製造を開始する予定です。 。 。このニュースを伝えたとき、私は Go...

...

メタバースがますます熱を帯びる中、開発者はどのような主要テクノロジーを掘り下げていくべきでしょうか?

「メタバース」という概念は昨年、海外で爆発的に広まりました。国内の専門家も、我が国の関連技術の開発...

...

強化学習の実際の応用例 10 選

強化学習では、報酬と罰のメカニズムを使用してエージェントをトレーニングします。エージェントは正しい行...