1。概要
IoTデバイス(機械工具、ボイラー、エレベーター、水量計、ガス計など)は、常に大量の機器ステータスデータとビジネスメッセージデータを生成します。これらのデータの収集、計算、分析には、異常なデータの検出が含まれることがよくあります。
DolphinDBには、高性能の分散時系列データベースとして、これらのIoTデータをリアルタイムで処理および分析し、履歴データの計算と分析を実行して、ユーザーがこれらのデータを使用および使用できるようにするストリーミングデータフレームワークが組み込まれています。値。DolphinDBの組み込みストリーミングデータフレームワークは、ストリーミングデータの公開、サブスクリプション、前処理、リアルタイムメモリ計算、複雑なインジケーターのローリングウィンドウ計算などをサポートします。これは、効率的で便利なストリーミングデータ処理フレームワークです。詳細については、DolphinDBストリーミングデータチュートリアルを参照してください。
DolphinDBは、異常データ検出のニーズに応え、ストリーミングデータフレームワークに基づく異常検出エンジン機能を提供します。ユーザーは異常インジケーターを指定するだけで、異常検出エンジンがリアルタイムで異常データ検出を実行できます。
2.異常検出エンジンフレームワーク
DolphinDBの異常検出エンジンは、ストリーミングデータの発行-サブスクライブモデルに基づいて構築されています。次の例では、createAnomalyDetectionEngine関数を使用して異常検出エンジンを作成し、subscribeTable関数を使用してストリーミングデータをサブスクライブします。新しいデータが流入するたびに、指定されたルールに従ってappend!{engine}がトリガーされ、ストリーミングデータが異常検出エンジンに継続的に入力されます。異常検出エンジンは、データがユーザー定義のアラームインジケータtemp> 65を満たしているかどうかをリアルタイムで検出し、異常なデータが見つかった場合は、それらをテーブルoutputTableに出力します。
センサーとしてstreamTable(1000:0、 `time`device`temp、[TIMESTAMP、SYMBOL、DOUBLE])を 共有します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))などの集計関数のパラメーターにあります。このようなインジケーターの場合、異常検出エンジンは、Time Series Aggregatorと同様に、ウィンドウが移動したときにのみデータを集約します。
- 表示される列名には、avg(qty)> qty、le(med(qty)、price)など、集計関数であるパラメーターと集計関数パラメーターではないパラメーターの両方があります。このような指標の場合、異常検出エンジンは、ウィンドウが移動すると集計列に対して集計計算を実行し、データが到着すると各データを計算します。集計関数の戻り値は、最新のウィンドウの計算値を使用します。
4.データウィンドウ
異常インジケータに集計機能が含まれている場合、ユーザーはデータウィンドウを指定する必要があります。フローデータ集計の計算は、一定の間隔で固定長の移動ウィンドウで実行されます。ウィンドウの長さはパラメータwindowSizeによって設定され、計算時間間隔はパラメータstepによって設定されます。
複数のデータセットの場合、各グループが最初のデータがシステムに入る時間に従ってデータウィンドウの境界を構築する場合、同じデータウィンドウ内の各グループの計算結果を比較することは一般に不可能です。これを考慮して、システムは、最初のデータウィンドウの各グループの境界値を調整するために、パラメーターステップ値に従って整数アライメントサイズalignmentSizeを決定します。
(1)データ時間タイプがMONTHの場合、最初のデータに対応する年の1月がウィンドウの上限として使用されます。
(2)データの時間タイプがDATEの場合、最初のデータウィンドウの境界値は調整されません。
(2)MINUTE、DATETIME、SECONDタイプなど、データ時間の精度が秒または分である場合、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値のルールは次のようになります。
ステップalignmentSize 〜2 0 2 3〜5 6〜10 10 11〜20 20 21〜25 25 26〜50 50 〜100 100 51 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)収集したデータを格納するフローデータテーブルセンサーを定義します。
streamTable(1000:0、 `time`temp、[TIMESTAMP、DOUBLE])をセンサーとして共有する
(2)異常検出エンジンと出力テーブルoutputTableを定義します。出力テーブルは、フローデータテーブルでもあります。
share streamTable(1000:0、 `time`anomalyType`anomalyString、[TIMESTAMP、INT、SYMBOL])as outputTable engine = createAnomalyDetectionEngine(" engine1 "、<[temp> 65、temp>パーセンタイル(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 センサー値に挿入(timev、tempv)
フローデータテーブルセンサーの内容を表示します。
時間温度 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.09 52 2018.10.08T01:01:01.010 56 2018.10.08T01:01:01.01155
結果テーブル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で、percentile(temp、75)の計算結果は60で、006から008のデータがこの値と比較され、条件は006です。3番目のウィンドウは003から008で、percentile(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()。AnomalDetectionAggregatorname ユーザーステータスlastErrMsgnumGroups numRowsnumMetricsメトリック -------- ----- ------ ---------- --------- ------- ---------- -------------------- engine1ゲストOK0 103温度> 65、温度>パーセンタイル(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は、ステップの整数倍である必要があります。そうでない場合、例外がスローされます。メトリックに集計関数がない場合、このパラメーターは効果がありません。
- garbageSize: 正整数。它是可选参数,默认值是50,000。如果没有指定keyColumn,当内存中历史数据的数量超过garbageSize时,系统会清理本次计算不需要的历史数据。如果指定了keyColumn,意味着需要分组计算时,内存清理是各分组独立进行的。当一个组的历史数据记录数超出garbageSize时,会清理该组不再需要的历史数据。若一个组的历史数据记录数未超出garbageSize,则该组数据不会被清理。如果metrics中没有聚合函数,这个参数不起作用。
7. 总结
DolphinDB提供的异常检测引擎是一个轻量、使用方便的流数据引擎,它通过与流数据表合作来完成流数据的实时检测任务,能够满足物联网实时监控和预警的需求。