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 コンセンサス アルゴリズム: リーダーを選出する方法

ブログ    
ブログ    

推薦する

AIと天気予報が出会うとどんな火花が散るのでしょうか?

SF作家の劉慈欣はかつて、自身の小説の中でこのような天気予報を描写した。小説の主人公は気象大学を卒...

...

人工知能時代の未来の教育

未来は、私たちが行く場所であるだけでなく、私たちが創り出す場所でもあるので、単なる時間の概念ではあり...

小型モデルは大型モデルとどう比較できるのか?北京理工大学はMindの大型モデルであるMindLLMをリリースし、小型モデルの大きな可能性を示した。

大規模言語モデル (LLM) は、さまざまな自然言語タスクで優れたパフォーマンスを発揮しています。た...

...

上位 10 の古典的なソート アルゴリズムの概要 (Java コード実装を含む)

最近、ソートアルゴリズムを勉強していて、多くのブログを読んでいます。インターネット上のいくつかの記事...

李開復:人工知能に取って代わるのが最も難しい10の仕事

[[246854]]私の意見では、警告、悲観、パニックはすべて「廬山の本当の顔を知らない」根拠のない...

2021年中国人工知能産業の現在の市場状況と有利な軌道の分析コンピュータビジョン軌道

——原題:2021年中国人工知能産業の市場現状と有利な軌道の分析。コンピュータビジョンは1000億...

ニューラルネットワークの背後にあるシンプルな数学

[[376715]] > Unsplash の Alina Grubnyak による画像ニュー...

誰でも簡単にウェブサイトを構築できる 5 つの AI ウェブサイトビルダー

今日は、5 つの AI ウェブサイト ビルダー ツールをご紹介します。これらの AI ツールを使用す...

世界初!人間の脳のようなスーパーコンピュータ「シェナン」がまもなく発売され、ムーアの法則を破り、エネルギー消費を数桁削減する

人間の脳は地球上で最も効率的な計算装置です。わずか 20W の電力と 1.3kg の質量で、1 秒間...

暗号化アルゴリズムの将来と現状の簡単な分析

[[357912]]現在最も一般的に使用されている暗号化アルゴリズムは、一方向暗号化と双方向暗号化に...

独身者は幸せだ!スタンフォード大学の教授がキューピッドに変身、AIアルゴリズムの矢印が真実の愛を見つけるのを手伝う

今日の多くの若い男女にとって、オンラインデートは恋愛関係を見つけるための第一歩です。アメリカでは、こ...

...