Azure Data LakeとPower BIでログデータを可視化する

独自フォーマットのログをAzure Data LakeとPower BIで可視化しました。
色々ハマったので手順を残しておきます。

元々ログの可視化はLog Analyticsのカスタムログを使って実現しようとしていました。
が、Log Analyticsカスタムログではうまくいかない箇所があったので、Data Lakeに切り替えました。
詳細は以下の記事に纏めていますのでご参考まで。

[独自フォーマットのログをAzure Log Analyticsに収集する](https://qiita.com/shingo_kawahara/items/3fb6c8922784f91ecaaf)

# Data Lake概要
* 以下の記事に纏めてます  
[Azure Data Lakeに触れてみた](https://qiita.com/shingo_kawahara/items/937b9e5ee6c8107f2840)

以降、Azure Data Lake Storeは、ADLS。
Azure Data Lake Analyticsは、ADLAと略します。

# ADLA/ADLS作成

* Market Placeより「Data Lake Analytics」を選択します。（ADLAからADLSを作成できるため、ここではADLAを選択）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/07f216aa-6810-fa7b-7b9e-3b3949e2a87b.png)
<br>

* ADLA/ADLSの名称を入力します。グローバルで一意にしないといけません。
* 2018年4月時点では日本リージョンにきてないので、他のリージョンを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c94cdbd4-977b-4ef8-b3d5-f09dc4aa8d24.png)
<br>

# ADLSへのログアップロード

## Azure Portalでアップロードする方法
* 今回は以下のサンプルログをアップロードします。
* CPU使用率を時系列で記録したファイルです。実際は数十行準備しました。
* 1番右のカラムがCPU使用率を表します。ファイルの先頭はヘッダー付きです。

```text:sample.txt
"IP ADDRESS","HOST NAME","HOST TYPE","RESOURCE TYPE","TYPE","CAPA","DATE","TIME","USECAPA"
 "192.168.0.1","host01","Windows","CPU","CPU","2597","2018/04/10","00:00:00",1.0
 "192.168.0.1","host01","Windows","CPU","CPU","2597","2018/04/10","00:10:00",1.5
 "192.168.0.1","host01","Windows","CPU","CPU","2597","2018/04/10","00:20:00",3.0
```

* ADLSを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a5ea22d1-d515-b964-ec8b-558e0c2b317b.png)
<br>

* 左メニューより、[Data Explorer]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a4a1e1d0-a532-ec56-86f6-fec0cc367072.png)
<br>

* [New folder]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/334e993f-6dac-0faa-2083-25d90f642835.png)
<br>

* 任意の名称を入力します。ここでは[log]にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/29827517-3ced-1bd1-cf3d-3250eb631f8c.png)
<br>

* 同じように[output]という名前のフォルダも作っておきます。これは分析結果を格納するフォルダにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f09450ca-55f7-d42e-f166-f2fbdd4cae77.png)
<br>

* 作成したフォルダを選択し、[Upload]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e227bf36-b7de-0981-095b-78c8636c5896.png)
<br>

* 事前に準備したサンプルログを選択し、アップロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c8534ba7-5fef-076e-a3fd-f8f27f9d9d7d.png)
<br>

## Azure CLIでアップロードする方法
* 以下コマンドで実現可能です。

```
az dls fs upload --account [ADLS Name] --source-path C:\sample.txt --destination-path log
```

# ADLAでクレンジング

* ADLAを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/7c2bf96e-5b00-9108-37b9-c9fd19fa29f6.png)
<br>

* 左メニューより、[New job]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/baef8810-0190-b3c0-2c59-f2dbf073c136.png)
<br>

* 以下のようなクエリ入力画面が表示されるので、ここにクエリを書いていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/5bfc78a9-b3a0-2c22-455e-8c5c8c9f779e.png)
<br>

* クエリを準備します。
    * EXTRACTでカラム名とデータ型を定義します。
    * 今回のサンプルでは日付と時刻が異なるカラムになっているので、DateTime.Parseでマージしています。
    * 最後にoutputフォルダにCSV形式で出力します。

```sql

@log =
	EXTRACT
        ip string,
        host_name string,
        host_type string,
        resource_type string,
        typea string,
        capa long,
        date string,
        time string,
        usecapa double
    FROM "log/sample.txt"
    USING Extractors.Csv(skipFirstNRows:1);

@merge =
    SELECT
        DateTime.Parse((date + ' ' + time)) AS daytime,
        ip,
        host_name,
        host_type,
        typea,
        capa,
        usecapa
    FROM @log;

OUTPUT @merge
TO "/output/sample-out.txt"
USING Outputters.Csv(outputHeader:true);
```

* クエリを入力して、[Submit」ボタンで実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8cdb8b0e-e6c3-6d09-a16f-c84c36c7bddc.png)
<br>

* こんな感じで処理が走るので完了するまで待ちます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/69924a62-8fd8-4a65-0fec-0ce2dbc0407a.png)
<br>

* クエリ失敗したらエラーメッセージが出力されるので、内容を見てクエリ修正して再実行してと繰り返します。

* 完了しました。結果を見てみましょう。[Data]タブを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b1ceac71-8c84-73f3-9349-39d9624e659b.png)
<br>

* [Outputs]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/830a9880-1777-83f8-e1f5-659bb1cb4658.png)
<br>

* クエリ実行結果ファイルのプレビューが表示されるため、意図した結果になっているか確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/669e8df5-ff16-eb5f-6f7d-12a8c7ed6a5e.png)
<br>

# Power BIで分析
* Power BI Desktopを開いて、サインインします。
* もし認証付きProxy配下の場合、以下のアドレスへのアクセスに対しては認証しないようにする設定をProxyサーバに入れないと繋がりません。

```text:PowerBIサインインに必要なURL
login.windows.net
outlook.office365.com
login.microsoftonline.com
api.powerbi.com
```

```text:ADLS読み込みに必要なURL
azuredatalakestore.net
```

* [データを取得]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/da67fcef-72d6-12ca-235b-878c510b5704.png)
<br>

* [Azure Data Lake Store]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/77ca3860-ea47-3d38-ebb8-a14da15fb003.png)
<br>

* AzureポータルのADLS概要ページよりURLをコピーする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/fee0b3b0-48e7-be1b-d6d0-0c0e2a4428c9.png)
<br>

* Power BI Desktopに戻り、先程のURLを貼り付けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/289107a8-3605-ed91-671e-34baa62c8594.png)
<br>

* 必要に応じてサインインして、[接続]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/67deda36-1d63-7016-4146-be1d6e4ace5b.png)
<br>

* 事前に作成したフォルダlogとoutputが見えてきてますね。[編集]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1d9e1a4a-8229-9796-de72-0dc2548686d6.png)
<br>

* クエリエディターが開くので、outputの[Table]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/437372cb-cc55-f908-b067-b79db8b6c952.png)
<br>

* [Binary]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/d0db1f0c-4d72-e662-e38e-509419899da0.png)
<br>

* データを確認することができました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/9e11801a-aa01-d89b-298a-051e50038b0f.png)
<br>

* [閉じて適用]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a1fad356-30f6-c382-988f-bef5e9cc20d6.png)
<br>

* あとはデータを選んで自由に可視化します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/96519059-b8d2-57d2-1023-87569a74cb5a.png)
<br>

# 日本語の文字列を可視化してみる
数値データだけでなく、日本語文字列のデータも可視化に加えてみます。

* 以下のサンプルデータを準備しました。アラートメッセージのイメージです。このとき文字コードはUTF-8で保存してください。

```text:sample_alert.txt
 "host01","3","エラーが発生しました。","2018/04/10","02:10:00",0000
```

* ADLSのlogフォルダにアップロードします。
* クエリ実行します。U-SQLは以下。
    * ポイントは最後のアウトプットです。Unicodeにエンコーディングして出力します。デフォルトはUTF-8ですが、そのままだとPower BI Desktopで読み込んだときに文字化けしてしまう為です。

```sql
@log =
	EXTRACT
        host_name string,
        id int,
        msg string,
        date string,
        time string,
        code string
    FROM "log/sample_alert.txt"
    USING Extractors.Csv();

@merge =
    SELECT
        DateTime.Parse((date + ' ' + time)) AS daytime,
        host_name,
        msg
    FROM @log;

OUTPUT @merge
TO "/output/sample_alert_output.txt"
USING Outputters.Csv(outputHeader:true,encoding:Encoding.Unicode);
```

* 実行完了すると先ほどと同じようにPower BI DesktopでADLSに接続して読み込みます。
* CPU使用率とアラートメッセージを同じページで可視化してみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b7ac98c4-12a0-ce3b-e3fb-231cab3d8796.png)
<br>

# まとめ
ADLSに溜めたデータをADLAで加工し、Power BIで可視化することができました。
Log AnalyticsでサポートしているログデータはLog Analyticsに集めて分析したほうがよいですが、今回のようにLog Analyticsカスタムログの仕様に当てはまらない場合は、Data Lakeも選択肢として使えそうですね。