Azure Databricks 系列 Blog(四)之通过 Azure Monitor 做集群监控

1. 前言

前面几篇系列博客分别给大家介绍了 Azure Databricks 的概念以及最常用的流计算及批处理框架,作为托管在 Azure 云上的 Spark 商业化产品,能看到 Azure Databricks 带给用户层面的便捷性还是非常具有吸引力的。可是在实际使用过程中,还有一点也非常的重要,就是集群的可靠性。可靠性大概应该分成两个层面,一是集群的可靠性 —— 虽然 Spark Cluster 的分布式架构已经充分考虑了可靠性,但是依然有故障的可能性;二是 Job 的可靠性 —— 提交的 Job 正常运行会和业务影响息息相关。针对这两个层面,可靠性的保证就需要依赖强大的监控系统,一个好的监控系统可以做到出现问题的时候及时通知用户,更好地可以做到未雨绸缪。目前做 Spark 监控的技术方案有很多,比如说 Prometheus、Nagios,包括 Azure Databricks 默认集成的 Ganglia,这些监控工具都有自己的优势和劣势。不过从云原生的角度讲,Azure Databricks 作为微软 Azure 云上的 PaaS 服务也可以和 Azure Monitor 做原生集成。本文就给大家介绍一下通过 Azure Monitor Log Analysis(下文简称 LA )来监控 Azure Databricks Cluster & Job,所有的测试都在 Global Azure US East 2 上测试实现。


2. 前期准备工作

本文的实验是基于 Github 开源代码的实现,原文可以看这里。具体原理是通过编译生成 spark-listeners-loganalytics 和 spark-listeners JAR 包并分发到所有计算节点上,然后 Job 通过 Spark 原生监控系统 Dropwizard Metrics Library 提供的指标集成 LA SDK 将 Cluster & Job 的 Metric & Logs 送到 LA 中,最后通过 LA Kusto 做监控分析告警。在实验开始之前,需要一些基础的准备工作,包括一台编译服务器,本文选择 CentOS 7,并安装 Azure Databricks CLI, JDK 8, Scala 2.11/12, Apache Maven 3.x。需要注意的是,Databricks CLI 的权限验证可以通过 Personal Token 或者 AAD,本文采用 AAD 认证,不过具体过程不赘述,请大家自行参考官方文档。安装好这些工具包之后,可以通过一些简单的测试比如 java -verison, mvn -V 以及 databricks clusters list 来进行验证。

1
2
3
4
# Testing
[root@centos01 ~]# java -verison
[root@centos01 ~]# mvn -V
[root@centos01 ~]# databricks clusters list

3. 编译 Azure Databricks monitoring library

编译 spark-listeners-loganalytics and spark-listeners 这两个 JAR 的时候有两种方法,一种通过 Docker Image 编译打包,另外一种通过 Maven,本文采用 Docker 来编译打包,速度会比较快。具体过程如下:

1
2
3
4
5
# To build all profiles:
[root@centos01 ~]# git clone https://github.com/mspnp/spark-monitoring.git
[root@centos01 ~]# cd spark-monitoring
[root@centos01 ~]# chmod +x ./build.sh
[root@centos01 ~]# docker run -it --rm -v `pwd`:/spark-monitoring -v "$HOME/.m2":/root/.m2 maven:3.5.4-jdk-8 /spark-monitoring/build.sh

编译好之后,所有的 JAR 都在 src/target 下:

1
2
3
4
5
6
7
8
9
10
[root@centos01 spark-monitoring]# ll src/target/
total 952
-rw-r--r-- 1 root root 206859 Mar 16 15:30 spark-listeners_2.4.3_2.11-1.0.0.jar
-rw-r--r-- 1 root root 206860 Mar 16 15:32 spark-listeners_2.4.5_2.11-1.0.0.jar
-rw-r--r-- 1 root root 150449 Mar 16 15:35 spark-listeners_3.0.0_2.12-1.0.0.jar
-rw-r--r-- 1 root root 150449 Mar 16 15:38 spark-listeners_3.0.1_2.12-1.0.0.jar
-rw-r--r-- 1 root root 73214 Mar 16 15:31 spark-listeners-loganalytics_2.4.3_2.11-1.0.0.jar
-rw-r--r-- 1 root root 73213 Mar 16 15:32 spark-listeners-loganalytics_2.4.5_2.11-1.0.0.jar
-rw-r--r-- 1 root root 51211 Mar 16 15:36 spark-listeners-loganalytics_3.0.0_2.12-1.0.0.jar
-rw-r--r-- 1 root root 51212 Mar 16 15:38 spark-listeners-loganalytics_3.0.1_2.12-1.0.0.jar

具体的 JAR 都指定对应了 Spark 和 Scala 版本,创建集群的时候需要注意指定对应的 JAR 。


4. 配置 Databricks workspace

通过 Azure Databricks CLI 在 DBFS 上创建一个目录 dbfs:/databricks/spark-monitoring:

1
dbfs mkdirs dbfs:/databricks/spark-monitoring

修改目录下 src/spark-listeners/scripts/spark-monitoring.sh 添加相关配置信息进入配置文件,包括 LA ID/Key, RG Name 等等,具体的每个配置项按照实际的属性值填入,这些配置会作为 HTTP 请求报头中的信息。

1
2
3
4
5
6
7
8
9
# LA ID/Key
export LOG_ANALYTICS_WORKSPACE_ID=
export LOG_ANALYTICS_WORKSPACE_KEY=
# Environment Variables
export AZ_SUBSCRIPTION_ID=
export AZ_RSRC_GRP_NAME=
export AZ_RSRC_PROV_NAMESPACE=Microsoft.Databricks
export AZ_RSRC_TYPE=workspaces
export AZ_RSRC_NAME=

配置结束后,最后把相关的监控脚本和 JAR 拷贝到 dbfs:/databricks/spark-monitoring 中:

1
2
3
4
[root@centos01 spark-monitoring]# dbfs cp src/spark-listeners/scripts/spark-monitoring.sh dbfs:/databricks/spark-monitoring/spark-monitoring.sh
[root@centos01 spark-monitoring]# ll src/target/ | awk '{print $9}' |sed '1d' > jarlist
[root@centos01 spark-monitoring]# while read line; do dbfs cp src/target/$line dbfs:/databricks/spark-monitoring/; done < jarlist
[root@centos01 spark-monitoring]# rm -f jarlist

此时,所有准备工作就准备完毕。下面就启动集群并提交运行 Sample Job 然后来看监控数据了。需要注意的是 Databricks Runtime Version 和对应的 Spark 及 Scala 版本以及在初始化运行中需要在 Advanced Options 中指定 Init Scripts 为 dbfs:/databricks/spark-monitoring/spark-monitoring.sh。


5. 运行 Sample Job

这个 Github Repository 同样包含了 Sample Job,可以通过该 Job 测试发送 Metric & Logs 到 LA。构建 Job 的时候,需要注意指定 Databricks Runtime 版本。

Databricks Runtime(s) Maven Profile
5.5 scala-2.11_spark-2.4.3
6.4 - 6.6 scala-2.11_spark-2.4.5
7.0 - 7.2 scala-2.12_spark-3.0.0
7.3 - 7.5 scala-2.12_spark-3.0.1

本文的 Databricks Runtime 为 7.3 LTS,所以对应的 Maven Profile 为 scala-2.12_spark-3.0.1。

1
docker run -it --rm -v `pwd`/sample/spark-sample-job:/spark-sample-job -v "$HOME/.m2":/root/.m2 -w /spark-sample-job maven:3.5.4-jdk-8 mvn install -P scala-2.12_spark-3.0.1

编译结束后,会在 spark-monitoring/sample/spark-sample-job/target 目录下生成一个 spark-monitoring-sample-1.0.0.jar,需要在提交 Job 的时候指定该 JAR 并指定 Main Class 为 com.microsoft.pnp.samplejob.StreamingQueryListenerSampleJob。


6. 在 Azure Monitor 查询验证

在 Job 提交运行之后,就可以到 LA 查看监控数据了。能够看到 LA 中出现了 3 个 custom table:SparkListenerEvent_CL、SparkLoggingEvent_CL、SparkMetric_CL 对应 Metric 和 Log。我们这里运行一个示例 Kusto 查询,来查询下产生的所有 Event:


7. 总结

至此,通过 Azure Monitor 监控 Azure Databricks 示例就完成了,需要注意在实际场景集成的时候,Job 依然要加载相应的类来做集成。衷心希望本文可以给各位读者一些参考并能在实际场景中有机的结合起来。