Azure MonitorでAzure Databricksのメトリックを監視する

## はじめに

Azure Databricksのメトリックを細かく取得して監視するにはAzure Monitorを使うと便利だ。Azure MonitorというよりLog Analyticsを使う感じになる。

基本的にはこちらの手順通りだけど、実際にセットアップする手順をここにまとめておく。
https://docs.microsoft.com/ja-jp/azure/architecture/databricks-monitoring/configure-cluster

## セットアップ方法

### 事前準備
ビルドに必要なもの

- JDK 1.8
- Scala SDK 2.11
- Maven

その他作業に必要なもの

- Azure Monitor (Log Analytics workspace)
- Databricks CLI

※Databricks CLIのインストール方法はこちらを参照
https://docs.azuredatabricks.net/user-guide/dev-tools/databricks-cli.html#set-up-the-cli


### 監視ライブラリをビルド

GitHubからクローン

```bash
$ git clone https://github.com/mspnp/spark-monitoring.git
```

移動してビルド

```bash

$ cd spark-monitoring/src/
$ mvn package
```

JARができてることを確認

```bash
$ find | grep '.jar'
./spark-listeners/target/spark-listeners-1.0-SNAPSHOT.jar
./spark-listeners-loganalytics/target/spark-listeners-loganalytics-1.0-SNAPSHOT.jar
./spark-jobs/target/spark-jobs-1.0-SNAPSHOT.jar
```

Databricks CLIでアップロードする

```bash
$ dbfs mkdirs dbfs:/databricks/monitoring-staging
$ dbfs cp ./spark-listeners/scripts/listeners.sh dbfs:/databricks/monitoring-staging/listeners.sh
$ dbfs cp ./spark-listeners/scripts/metrics.properties dbfs:/databricks/monitoring-staging/metrics.properties
$ dbfs cp ./spark-listeners/target/spark-listeners-1.0-SNAPSHOT.jar dbfs:/databricks/monitoring-staging/spark-listeners-1.0-SNAPSHOT.jar
$ dbfs cp ./spark-listeners-loganalytics/target/spark-listeners-loganalytics-1.0-SNAPSHOT.jar dbfs:/databricks/monitoring-staging/spark-listeners-loganalytics-1.0-SNAPSHOT.jar
```

### Databricksクラスターを作成

[Advanced Options]の[Spark]タブの[Spark Config]に以下を追加

```configuration
spark.extraListeners com.databricks.backend.daemon.driver.DBCEventLoggingListener,org.apache.spark.listeners.UnifiedSparkListener
spark.unifiedListener.sink org.apache.spark.listeners.sink.loganalytics.LogAnalyticsListenerSink
spark.unifiedListener.logBlockUpdates false
```
[Advanced Options]の[Spark]タブの[Spark Config]に以下を追加

```
LOG_ANALYTICS_WORKSPACE_ID=[your Azure Log Analytics workspace ID]
LOG_ANALYTICS_WORKSPACE_KEY=[your Azure Log Analytics workspace key]
```

[Advanced Options]の[Init Scripts]タブでlisteners.shを追加 (下図のように)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144789/36e581a9-7b45-ae8b-35cd-c178572acfcc.png)

設定完了したらクラスターを起動する

※環境変数に設定しているのにLog Analytics workspace IDが空だと言われてクラスターが起動しなかったので、
listeners.shに直接Log Analytics workspace IDとLog Analytics workspace keyを書き込んであげたら起動した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144789/24e59bb9-24d6-0206-e591-6384232d3a10.png)

## メトリックの確認

上記設定後クラスターを起動すると、メトリックデータをAzure Monitorにストリーミングしてしばらく経つと (しばらく、といっても数時間と結構時間がかかるが) Log Analytics workspaceにスキーマが反映される。

ログは [アクティブ > Custom Logs ] の配下に入る。

|スキーマ|格納される内容|
|---|---|
|SparkMetric_CL|Sparkクラスター自体のメトリックが入る|
|SparkListenerEvent_CL|Spark Structured Streamingのログイベントが入る|
|SparkLoggingEvent_CL|Sparkレベルのログイベントが入る|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144789/fa0371a5-1596-c4ef-09d3-4470ef7dbac3.png)

これで基本的(といっても結構細かく取れる)なメトリックやログイベントが取れるようになったので、次の記事あたりで実際のDatabricksのアプリケーションログを取得する方法を試してみようと思う。
Azure Monitorにログを取得しておくと、後で [Grafanaで可視化](https://qiita.com/whata/items/4be2eefdf983aa7fb0ab) するといったこともわりと容易にできるので便利だ。