読者です 読者をやめる 読者になる 読者になる

Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Prelertでプログラミングレスな異常検知に挑戦!

こんにちは!
@です。

最近、データの中から特異点や異常な箇所を発見したいニーズが高まっています。

そんななか、先日、Elastic社が行動分析技術の大手プロバイダPrelertを買収したとのニュースがありました。

ちなみにPrelert社とは異常検知を自動化するため、データの知識が不要なアプリケーションをエンドユーザーに提供していた企業です。

Prelertのサイトを確認すると、Elasticsearchに入れたデータに対して異常検知することができそうです。
これは面白そう! ということで、Prelertを使って異常検知を行ってみました。

今回は、次の流れで説明していきます。

Prelertとは

PrelertはITセキュリティと運用チームのための行動分析ツールです。公式サイトは次のとおりです。

公式サイトに掲載されている特徴として、次の3つがあります。

  1. 脅威を早期に検出・・・リアルタイムに近いデータ処理でユーザがレポートを出す前に検知する。
  2. より高速な原因の発見・・・環境の学習を行い、より高速に原因を分析できる。
  3. 少ない偽陽性の検出・・・データのコンテキストを理解し、偽陽性の検出を減らす。

いくつか魅力的な特徴が上がっています。
しかし、私の考える最も良い点はプログラミングレスであり、かつ数式を意識する必要がない点だと思います。
そのため、なんとなく異常検知に取り組みたいと考えている人も、複雑な数式を学ぶ必要はなく、Prelertを使って異常検知できます。
また、Prelertは教師なし学習のため、予め教師データの異常をラベリングする必要がないことも特筆すべき点だと思います。

Prelertでは、次のような画面で異常を検知することができます。
後ほど詳細を記載しますが、白 → 青 → 黄 → オレンジ → 赤と、赤に近いほど異常度合いが高いことを示しています。

f:id:acro-engineer:20161029175822j:plain

Prelertのインストール

公式サイトからのダウンロード

PrelertのBeta版を公式サイトからダウンロードすることができます。
Prelert behavioral analytics platform: Home

今回はトップページにあった「Behavioral Analytics for the Elastic Stack Beta」のFree Trialを試します。
Free Trialを行なうにあたって登録が必要となります。登録するとインストーラがダウンロードでき、また14日間の試用ライセンスキーがメールで届きます。

f:id:acro-engineer:20161020232454p:plain

インストール

Prelertのインストールは、基本的にインストーラーに従うだけで完了しました。
途中ライセンスキーを求められるため、メールで届いているものを利用します。

このインストーラによりインストールされるプロダクトは次の通りです。

  • Prelert Engine API version: 2.1.2
  • Prelert analytics version: 6.3.1
  • Kibana version: 4.6.1
  • Elasticsearch version: 2.4.0

ちなみにPrelertをインストールすると、OS起動時にこれらのプロダクトが起動します。
私は別のElasticsearchを起動していて、うっかり同じポート番号を使ってしまっており、起動に失敗しました。
Windows環境では自動起動のサービスを「Shutdown Prelert Engine Service」でOFFにすることができます。

起動確認

Windows環境では「Start Prelert Engine Service」を実行すると、elasticsearch、kibanaが起動します。
kibanaの画面を見てみましょう。
http://localhost:5601/」へアクセスをすると、PluginにPrelertがあることが分かります。
f:id:acro-engineer:20161029175028j:plain

Prelertを開くと、次のような画面になります。
f:id:acro-engineer:20161029175035j:plain

無事にインストールできているようです。

実際に異常検知をやってみる。

データ投入

では実際に異常検知をやってみましょう。
今回は異常検知の対象データとして、Numenta Anomaly Benchmark(NAB)にある、CPU使用率のデータを利用しました。

次のようなデータです。時間とCPU使用率が列挙されています。

timestamp value
2014-05-14 01:14:00 85.835
2014-05-14 01:19:00 88.167
2014-05-14 01:24:00 44.595

このデータをKibanaで可視化すると、次のようになります。

f:id:acro-engineer:20161029175106j:plain

あぁなんか見るからに異常値が・・・みたいなことは、気づかないのが大人です。


NABのデータはcsv形式で提供されているため、logstash2.4.0を使ってElasticsearchに投入しました。
参考までに、Elasticsearch上に作ったマッピング定義と、Logstashの設定を掲載しておきます。

マッピング定義

データを投入する前に、Elasticsearch上でマッピング定義を作っておきました。

{
  "mappings": {
    "_default_": {
      "_all": {
        "enabled": true,
        "norms": {
          "enabled": false
        }
      },
      "properties": {
        "timestamp": {
          "type": "date",
          "format": "YYYY-MM-dd HH:mm:ss"
        },
        "value": {
          "type": "double"
        }
      }
    }
  },
  "settings": {
    "index.refresh_interval": "5s"
  },
  "template": "cpu_utilization_asg_misconfiguration"
}
Logstashを使ったデータ投入

Logstashのconfファイルは次の通りです。

input {
   stdin{}
}

filter {
    csv {
        columns => ['timestamp', 'value']
    }

    date {
        match => [ "timestamp", "YYYY-MM-dd HH:mm:ss" ]
        timezone => "UTC"
    }
}

output {
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "cpu_utilization_asg_misconfiguration"
    }
}

この設定とtypeコマンドを使ってデータを流し込みました。

Prelertを使った異常検知の実行

ではPrelertで異常検知を行なってみます。

Jobの作成

まず異常検知するためのJobを作成します。最初にデータソースを選択します。
今回はElasticsearchにデータを保存しているので「Elasticsearch server」を選択しました。
f:id:acro-engineer:20161029175202p:plain

次にindexやtype、日付フォーマットなどを指定します。
f:id:acro-engineer:20161029175226j:plain
indexは一つしか選べませんば、typeは複数選べますね。

Jobの詳細設定

続いてJobの詳細を設定します。
タブの中から「Analysis Configuration」を選んで異常検知の設定をします。

f:id:acro-engineer:20161029175549j:plain

まずbucketSpanは「5minutes」とします。
bucketSpanは集約期間を示しており、たとえば5minutesとした場合は、5分間での平均や合計を用いて検知することになります。


次に「Add Detector」から、異常検知のルールを追加します。
今回はfunctionにmean(平均)、fieldNameにvalueを設定しました。

f:id:acro-engineer:20161022133715j:plain

それぞれのパラメータの意味は次の通りです

  1. function: 検知に用いる集計関数(平均や合計)
  2. fieldName: 検知の対象となるフィールド

これで、5分間の平均値が異常な値になった場合に検知できるようになります。
ここまでで、異常と判断する閾値や、アルゴリズム、パラメータなどを設定していないあたりがポイントですね。


これで、Saveを押すと異常検知アルゴリズムの設定は完了です。
保存時に「No Influencers」と警告が現れますが、今回は設定しないので、力強く「OK」を押しました。

そして「Start Scheduler」を押して、検知の対象とするデータの範囲(開始時間、流量時間)を指定します。

f:id:acro-engineer:20161029175721j:plain

これでStartを押すとJobが動き出し、異常検知のスコアが計算されます。
しばらく待って完了したら、異常検知の処理は完了です。

f:id:acro-engineer:20161029175856j:plain

今回のデータ量であれば、数秒程度で処理は終わりました。

Prelertの画面説明

それでは異常検知の結果を見てみましょう。

画面の上の方にタブがありますが、それぞれのタブでは次のような情報の閲覧、管理ができます。

画面 機能概要
Jobs 異常検知タスクを管理する画面
Summary View 異常検知の概要を見る画面
Explorer 詳細に異常検知の概要を見る画面
Connections Exploere画面に出ているアラート一覧を、influencerごとにまとめた画面
Supports ElasticsearchのVersion、サポート情報が書いてある画面

それぞれの画面を見ていきましょう。ただしConnectionsは今回は扱いません

Jobs

Jobsは、Jobに対する操作や情報を確認することができる画面です。

f:id:acro-engineer:20161029175856j:plain

それぞれのカラムは、次のことを示しています。

カラム 概要
Search Name 設定したJobの名前
Description 設定したJobの説明
Processed records どのくらいのデータを処理したか
Memory status メモリの状態
Job Status Jobの状態
Latest timestamp 処理完了したデータで最も遅い時間
Actions Jobに対するアクションが記載されています。
左から順番に、Jobの開始、結果確認、Exprolerの確認、Jobの編集、複製、削除となっています。
Summary View

Summary Viewは、結果の概要を色分けして示す画面です。
時間ごとの異常度合いを色で示しており、白 → 青 → 黄 → オレンジ → 赤 と、赤に近いほど異常度合いが高いことを示しています。

f:id:acro-engineer:20161029175822j:plain

Explorer

Explorerは詳細を確認する画面です。
Explorer画面のAnomaly timelineでは、Detectorの集約期間ごとの異常値を表示します。
また、Anomaliesは画面に表示されている異常検知の値をジャーナル形式で表示しています。
このジャーナル形式から具体的な値や検出位置を確認することができます。

f:id:acro-engineer:20161029175747j:plain

今回投入したデータは、NAB/known_labels_v1.0.json at master · numenta/NAB · GitHub の情報によると、「2014-07-12 02:04:00.000000」と「2014-07-14 21:44:00.000000」に異常があるようです。
さて、Prelertの実行結果はと言うと、Summary ViewやExplorerの図で分かる通り、2014年7月15日付近(右端)の色が変わっており、うまく検知できているようです。

このように、Prelertを使うと簡単な操作でデータから異常を検知することができます。

最後に

Prelert、いかがでしたでしょうか?
Prelertを使うと、Elasticsearchに入っているデータに対し、プログラミングレスで異常検知と可視化ができます。
これで、Elasticsearchがますます便利になりますね!

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、AWSHadoop、Storm、NoSQL、Elasticsearch、SpringBoot、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com