時系列データベースの監視と早期警告丨DolphinDB異常検出エンジンのチュートリアル

1。概要

IoTデバイス(工作機械、ボイラー、エレベータ、水道メーター、ガスメーターなど)は、常に大量の機器ステータスデータとビジネスメッセージデータを生成します。これらのデータの収集、計算、分析には、多くの場合、検出が含まれます。異常なデータの。

DolphinDBは、高性能の分散時系列データベースとして、これらのIoTデータをリアルタイムで処理および分析し、履歴データの計算と分析を実行して、ユーザーがその役割を果たすのに役立つストリーミングデータフレームワークを組み込んでいます。これらのデータの値。DolphinDBの組み込みストリーミングデータフレームワークは、ストリーミングデータの公開、サブスクリプション、前処理、リアルタイムメモリ計算、複雑なインジケーターのローリングウィンドウ計算などをサポートします。これは効率的で便利なストリーミングデータ処理フレームワークです。詳細については、DolphinDBストリーミングデータチュートリアルを参照してください

DolphinDBは、異常データ検出のニーズに応えて、ストリーミングデータフレームワークに基づく異常検出エンジン機能を提供します。ユーザーは異常インジケーターを指定するだけで、異常検出エンジンはリアルタイムで異常データ検出を実行できます。

2.異常検出エンジンフレームワーク

DolphinDBの異常検出エンジンは、ストリーミングデータのパブリッシュ/サブスクライブモデルに基づいて構築されています。次の例では、createAnomalyDetectionEngine関数を使用して異常検出エンジンを作成し、subscribeTable関数を使用してストリーミングデータをサブスクライブします。新しいデータが流入するたびに、指定されたルールに従ってappend!{engine}がトリガーされ、ストリーミングデータがトリガーされます。異常検出エンジンに継続的に入力されます。異常検出エンジンは、データがユーザー定義のアラームインジケータtemp> 65を満たしているかどうかをリアルタイムで検出し、異常データが見つかった場合は、それらをテーブルoutputTableに出力します。

share streamTable(1000:0, `time`device`temp, [TIMESTAMP, SYMBOL, DOUBLE]) as sensor
share streamTable(1000:0, `time`device`anomalyType`anomalyString, [TIMESTAMP, SYMBOL, INT, SYMBOL]) as outputTable
engine = createAnomalyDetectionEngine("engine1", <[temp > 65]>, sensor, outputTable, `time, `device, 10, 1)
subscribeTable(, "sensor", "sensorAnomalyDetection", 0, append!{engine}, true)

例外処理エンジンに関連するいくつかの概念の簡単な紹介を次に示します。

  • ストリーミングデータテーブル:DolphinDBは、ストリーミングデータ用の特定のテーブルオブジェクトを提供します。これは、ストリーミングデータの公開機能を提供します。subscribeTable関数を介して、他のノードまたはアプリケーションはストリーミングデータをサブスクライブして消費できます。
  • 例外処理エンジンのデータソース:例外処理エンジンの「原材料」のチャネルを提供します。createAnomalyDetectionEngine関数は、抽象テーブルを返します。この抽象テーブルにデータを書き込むと、データは計算のために例外処理エンジンに入ります。
  • 異常インジケーター:ストリーミングデータをメタコード形式で処理するためのブール式のセットを提供します。複雑なシナリオをサポートするための集計関数を含めることができます。
  • データウィンドウ:各計算中にインターセプトされたストリームデータウィンドウの長さ。データウィンドウは、インジケーターに集計関数が含まれている場合にのみ意味があります。
  • 出力テーブル:異常検出エンジンの出力テーブルの最初の列は、検出された異常のタイムスタンプを格納するために使用される時間タイプである必要があります。指定されたグループ化列がある場合、2番目の列はグループ化列です。次の2つの列は、タイプintであり、文字列またはシンボルタイプは、異常タイプ(メトリックの異常インデックス式の添え字)と異常コンテンツを記録するために使用されます。

3.異常な指標

ブール値を返すには、異常検出エンジンのインジケーターが必要です。一般的には関数または式です。インジケーターに集計関数が含まれている場合は、ウィンドウの長さと計算間隔を指定する必要があります。異常検出エンジンは、一定の間隔で固定長の移動ウィンドウ内のインジケーターを計算します。一般に、異常な指標には3つのタイプがあります。

  • 列名またはqty> 10、lt(qty、prev(qty))などの非集計関数のみを含めます。このような指標の場合、異常検出エンジンは受信した各データを計算し、それが指標を満たしているかどうかを判断し、出力するかどうかを決定します。
  • 表示されるすべての列名は、avg(qty-price)> 10、percentile(qty、90)<100、sum(qty)> prev(sum(qty))などの集計関数のパラメーターに含まれています。このようなインジケーターの場合、異常検出エンジンは、時系列アグリゲーターと同様に、ウィンドウが移動したときにのみデータを集約します。
  • 表示される列名には、avg(qty)> qty、le(med(qty)、price)など、集計関数であるパラメーターと集計関数パラメーターではないパラメーターの両方があります。このような指標の場合、異常検出エンジンは、ウィンドウが移動すると集計列に対して集計計算を実行し、データが到着すると各データを計算します。集計関数の戻り値は、最新のウィンドウの計算値を使用します。

4.データウィンドウ

異常インジケータに集計関数が含まれている場合、ユーザーはデータウィンドウを指定する必要があります。フローデータの集計計算は、一定の間隔で固定長の移動ウィンドウで実行されます。ウィンドウの長さはパラメータwindowSizeによって設定され、計算時間間隔はパラメータstepによって設定されます。

複数のデータセットの場合、各グループが最初のデータがシステムに入る時間に従ってデータウィンドウの境界を構築する場合、同じデータウィンドウ内の各グループの計算結果を比較することは一般に不可能です。 。この点を考慮して、システムはパラメータステップ値に従って整数アライメントサイズalignmentSizeを決定し、各グループの最初のデータウィンドウの境界値に対してアライメント処理を実行します。

(1)データ時間タイプがMONTHの場合、最初のデータに対応する年の1月がウィンドウの上限として使用されます。

(2)データの時間タイプがDATEの場合、最初のデータウィンドウの境界値は調整されません。

(2)MINUTE、DATETIME、SECONDタイプなど、データ時間の精度が秒または分である場合、alignmentSize値のルールは次のとおりです。

step     alignmentSize
0~2      2
3~5      5
6~10     10
11~15    15
16~20    20
21~30    30
31~60    60

(2)TIMESTAMPやTIMEタイプなど、データの時間精度がミリ秒の場合、alignmentSize値のルールは次のようになります。

step       alignmentSize
0~2        2
3~5        5
6~10       10
11~20      20
21~25      25
26~50      50
51~100     100
101~200    200
201~250    250
251~500    500
501~1000   1000

最初のデータ時間の最小精度がxであるとすると、正則化後の最初のデータウィンドウの左側の境界の最小精度はx / alignmentSize \ * alignmentSizeです。ここで、/は除算後の丸めを表します。たとえば、最初のデータの時刻が2018.10.08T01:01:01.365の場合、x = 365です。step = 100の場合、上記の表によれば、alignmentSize = 100、正規化後の最初のデータウィンドウの左側の境界の最小精度は365 \ 100 * 100 = 300であると結論付けることができます。したがって、最初のデータの範囲は正規化後のウィンドウは2018.10です。08T01:01:01.300から2018.10.08T01:01:01.400。

5.アプリケーション例

5.1アプリケーションシナリオ

次に、センサー機器をシミュレートして温度を収集します。ウィンドウの長さを4msとすると、ウィンドウは2msごとに移動し、温度は1msごとに収集されます。次の異常インジケータが指定されています。

  • 1つのコレクションの温度が65を超えています。
  • 1回の取得の温度が、前のウィンドウの値の75%を超えています。
  • ウィンドウ内の平均温度と前のウィンドウの平均温度の間の相対誤差は1%を超えています。

5.2システム設計

収集したデータはストリーミングデータテーブルに格納され、異常検出エンジンはストリーミングデータテーブルにサブスクライブしてリアルタイムデータを取得し、異常検出を実行して、異常インデックスに一致するデータを別のテーブルに出力します。

5.3実装手順

(1)収集したデータを保存するフローデータテーブルセンサーを定義します。

share streamTable(1000:0, `time`temp, [TIMESTAMP, DOUBLE]) as sensor

(2)異常検出エンジンと出力テーブルoutputTableを定義します。出力テーブルは、フローデータテーブルでもあります。

share streamTable(1000:0, `time`anomalyType`anomalyString, [TIMESTAMP, INT, SYMBOL]) as outputTable
engine = createAnomalyDetectionEngine("engine1", <[temp > 65, temp > percentile(temp, 75), abs((avg(temp) - prev(avg(temp))) / avg(temp)) > 0.01]>, sensor, outputTable, `time, , 6, 3)

(3)異常検出エンジンエンジンは、フローデータテーブルセンサーにサブスクライブします。

subscribeTable(, "sensor", "sensorAnomalyDetection", 0, append!{engine}, true)

(4)フローデータテーブルセンサーに10回書き込み、取得温度をシミュレートします。

timev = 2018.10.08T01:01:01.001 + 1..10
tempv = 59 66 57 60 63 51 53 52 56 55
insert into sensor values(timev, tempv)

フローデータテーブルセンサーの内容を表示します。

time                       temp
2018.10.08T01:01:01.002    59
2018.10.08T01:01:01.003    66
2018.10.08T01:01:01.004    57
2018.10.08T01:01:01.005    60
2018.10.08T01:01:01.006    63
2018.10.08T01:01:01.007    51
2018.10.08T01:01:01.008    53
2018.10.08T01:01:01.009    52
2018.10.08T01:01:01.010    56
2018.10.08T01:01:01.011    55

結果テーブルoutputTableをもう一度確認します。

time                      anomalyType    anomalyString
2018.10.08T01:01:01.003    0             temp > 65
2018.10.08T01:01:01.003    1             temp > percentile(temp, 75)
2018.10.08T01:01:01.005    1             temp > percentile(temp, 75)
2018.10.08T01:01:01.006    2             abs((avg(temp) - prev(avg(temp))) / avg(temp)) > 0.01
2018.10.08T01:01:01.006    1             temp > percentile(temp, 75)
2018.10.08T01:01:01.009    2             abs((avg(temp) - prev(avg(temp))) / avg(temp)) > 0.01

異常検出エンジンの計算プロセスについては、以下で詳しく説明します。読みやすくするために、2018.10.08T01:01:01の同じ部分は時間の説明から省略され、ミリ秒の部分のみがリストされています。

(1)インジケーターtemp> 65には、関数パラメーターではない列tempのみが含まれているため、各データが到着したときに計算されます。シミュレーションデータの003の温度のみが、異常を検出するための基準を満たしています。

(2)インジケーターtemp> percentile(temp、75)では、temp列が集計関数percentileのパラメーターとして使用され、別々に表示されます。したがって、各データが到着すると、temp> percentileは前のウィンドウ(temp、75)の比較。最初のウィンドウは、データの最初の行の時間002に基づいて整列されます。整列後、ウィンドウの開始境界は000です。最初のウィンドウは000から002であり、002レコードのみが含まれます。percentile( temp、75)は59です。データ003から005はこの値と比較され、003と005は条件を満たす。2番目のウィンドウは002から005で、パーセンタイル(temp、75)の計算結果は60で、006から008のデータがこの値と比較され、条件を満たす006があります。3番目のウィンドウは003から008で、パーセンタイル(temp、75)の計算結果は63で、データ009から011がこの値と比較され、条件を満たす行はありません。最後のデータ011が到着した後、新しいウィンドウ計算はまだトリガーされていません。

(3)インジケーターabs((avg(temp)-prev(avg(temp)))/ avg(temp))> 0.01では、tempは集計関数avgのパラメーターとしてのみ表示されるため、毎回チェックされます。ウィンドウが計算される時間。前の指標の分析と同様に、最初の3つのウィンドウから計算されたavg(temp)はそれぞれ59、60.5、58.33であり、abs((avg(temp)-prev(avg(temp)))/ avg(temp)を満たします。 ))> 0.01の時間は、2番目のウィンドウと3番目のウィンドウの計算時間006と009です。

5.4異常検出エンジンのステータスの監視

getAggregatorStat().AnomalDetectionAggregator
name    user  status lastErrMsg numGroups numRows numMetrics metrics             
------- ----- ------ ---------- --------- ------- ---------- --------------------
engine1 guest OK                0         10      3          temp > 65, temp > percentile(temp, 75), abs((avg(temp) - prev(avg(temp))) / avg(temp)) > 0.01

5.5異常検出エンジンを削除する

removeAggregator("engine1")

6.createAnomalyEngine関数の概要

文法

createAnomalyDetectionEngine(name, metrics, dummyTable, outputTable, timeColumn, [keyColumn], [windowSize], [step], [garbageSize]) 

オブジェクトを返す

createAnomalyDetectionEngineの機能は、テーブルオブジェクトを返すことです。テーブルにデータを書き込むことは、これらのデータが計算のために異常検出エンジンに入力されることを意味します。

パラメータ

  • name:異常検出エンジンの名前を表す文字列。異常検出エンジンの一意の識別子です。文字、数字、アンダースコアを含めることができますが、文字で始める必要があります。
  • メトリック:メタコード。その戻り値はbool型でなければなりません。<[qty> 5、eq(qty、price)]>などの関数または式にすることができます。<[sum(qty)> 5、lt(avg(price)、price)]>などのシステム組み込み関数またはユーザー定義の集計関数(defgキーワードで定義)を使用できます。詳細については、メタプログラミングを参照してください
  • ダミーテーブル:テーブルオブジェクト。データを含める必要はありませんが、その構造はサブスクライブされたストリームデータテーブル構造と同じである必要があります。
  • outputTable:計算結果を保存するために使用されるテーブルオブジェクト。その最初の列は、異常が検出されたときのタイムスタンプを格納するために使用される時間タイプである必要があり、この列のデータ型は、dummyTableの時間列と一致している必要があります。keyColumnパラメーターが空でない場合、outputTableの2番目の列はkeyColumnです。次の2つの列は、int型とstring / symbol型であり、例外の型(メトリックの添え字)と例外の内容を記録するために使用されます。
  • timeColumn:入力ストリームデータテーブルの時間列名を表す文字列スカラー。
  • keyColumn:グループ化列を表す文字列スカラー。異常検出エンジンは、keyColumnに従って入力データをグループ化し、各グループで集計計算を実行します。これはオプションのパラメーターです。
  • windowSize:正の整数。集計関数がメトリックに含まれている場合は、windowSizeを指定して、集計計算に使用されるデータウィンドウの長さを示す必要があります。メトリックに集計関数がない場合、このパラメーターは効果がありません。
  • ステップ:正の整数。集計関数がメトリックに含まれている場合は、計算の時間間隔を示すステップを指定する必要があります。windowSizeは、ステップの整数倍である必要があります。そうでない場合、例外がスローされます。メトリックに集計関数がない場合、このパラメーターは効果がありません。
  • ガベージサイズ:正の整数。これはオプションのパラメーターであり、デフォルト値は50,000です。keyColumnが指定されていない場合、メモリ内の履歴データの数がgarbageSizeを超えると、システムはこの計算に必要のない履歴データをクリーンアップします。keyColumnが指定されている場合、グループ計算が必要な場合、メモリクリーニングがグループごとに個別に実行されることを意味します。グループの履歴データレコードの数がgarbageSizeを超えると、グループで不要になった履歴データがクリーンアップされます。グループの履歴データレコードの数がgarbageSizeを超えない場合、データのグループはクリーンアップされません。メトリックに集計関数がない場合、このパラメーターは効果がありません。

7.まとめ

DolphinDBが提供する異常検出エンジンは、軽量で使いやすいストリーミングデータエンジンです。ストリーミングデータテーブルと連携して、ストリーミングデータのリアルタイム検出タスクを完了します。これにより、リアルタイム監視のニーズを満たすことができます。モノのインターネットの早期警告。

おすすめ

転載: blog.csdn.net/qq_41996852/article/details/110931593