你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 Azure Databricks 应用程序日志发送到 Azure Monitor

注意

本文依赖于 GitHub 上托管的开放源代码库:https://github.com/mspnp/spark-monitoring

原始库支持 Azure Databricks Runtimes 10.x (Spark 3.2.x) 和更低版本。

Databricks 在 l4jv2 分支(参见 https://github.com/mspnp/spark-monitoring/tree/l4jv2)上贡献了一个更新版本来支持 Azure Databricks Runtimes 11.0 (Spark 3.3.x) 及更高版本。

请注意,由于 Databricks Runtimes 中使用的日志记录系统不同,11.0 版本不向后兼容。 请确保为 Databricks Runtime 使用正确的版本。 库和 GitHub 存储库处于维护模式。 没有进一步发布的计划,问题支持部门只会尽力而为。 如果对于此库或 Azure Databricks 环境的监视和日志记录路线图有任何其他问题,请联系 azure-spark-monitoring-help@databricks.com

本文演示如何将应用程序日志和指标从 Azure Databricks 发送至 Log Analytics 工作区。 其中使用 Azure Databricks 监视库,你可通过 GitHub 获取该库。

先决条件

按照 GitHub 自述文件中所述,配置 Azure Databricks 群集,以使用监视库。

注意

监视库将 Apache Spark 级别事件和 Spark 结构化流式处理指标从作业流式传输到 Azure Monitor。 对于这些事件和指标,无需对应用程序代码做出任何更改。

使用 Dropwizard 发送应用程序指标

Spark 使用基于 Dropwizard 指标库的可配置指标系统。 有关详细信息,请参阅 Spark 文档中的指标

要将应用程序指标从 Azure Databricks 应用程序代码发送至 Azure Monitor,请执行以下步骤:

  1. 按照 GitHub 自述文件中所述,构建 spark-listeners-loganalytics-1.0-SNAPSHOT.jar JAR 文件。

  2. 在应用程序代码中创建 Dropwizard 仪表或计数器。 可以使用监视库中定义的 UserMetricsSystem 类。 以下示例创建一个名为 counter1 的计数器。

    import org.apache.spark.metrics.UserMetricsSystems
    import org.apache.spark.sql.SparkSession
    
    object StreamingQueryListenerSampleJob  {
    
      private final val METRICS_NAMESPACE = "samplejob"
      private final val COUNTER_NAME = "counter1"
    
      def main(args: Array[String]): Unit = {
    
        val spark = SparkSession
          .builder
          .getOrCreate
    
        val driverMetricsSystem = UserMetricsSystems
            .getMetricSystem(METRICS_NAMESPACE, builder => {
              builder.registerCounter(COUNTER_NAME)
            })
    
        driverMetricsSystem.counter(COUNTER_NAME).inc(5)
      }
    }
    

    监视库包含演示如何使用 UserMetricsSystem 类的示例应用程序

使用 Log4j 发送应用程序日志

要使用库中的 Log4j 追加器将 Azure Databricks 应用程序日志发送至 Azure Log Analytics,请执行以下步骤:

  1. 按照 GitHub 自述文件中所述,构建 spark-listeners-1.0-SNAPSHOT.jar 与 spark-listeners-loganalytics-1.0-SNAPSHOT.jar JAR 文件。

  2. 为应用程序创建 log4j.properties 配置文件。 包括以下配置属性。 将指示的部分替换为应用程序包名称与日志级别:

    log4j.appender.A1=com.microsoft.pnp.logging.loganalytics.LogAnalyticsAppender
    log4j.appender.A1.layout=com.microsoft.pnp.logging.JSONLayout
    log4j.appender.A1.layout.LocationInfo=false
    log4j.additivity.<your application package name>=false
    log4j.logger.<your application package name>=<log level>, A1
    

    可以在此处找到示例配置文件。

  3. 在应用程序代码中,加入 spark-listeners-loganalytics 项目,并导入 com.microsoft.pnp.logging.Log4jconfiguration 应用程序代码。

    import com.microsoft.pnp.logging.Log4jConfiguration
    
  4. 使用在步骤 3 中创建的 log4j.properties 文件配置 Log4j:

    getClass.getResourceAsStream("<path to file in your JAR file>/log4j.properties") {
          stream => {
            Log4jConfiguration.configure(stream)
          }
    }
    
  5. 根据需要将 Apache Spark 日志消息添加至代码中的适当级别。 例如:使用 logDebug 方法发送调试日志消息。 有关详细信息,请参阅 Spark 文档中的记录

    logTrace("Trace message")
    logDebug("Debug message")
    logInfo("Info message")
    logWarning("Warning message")
    logError("Error message")
    

注意

如果使用库且具有 Apache Spark 笔记本,那么 Spark 在执行笔记本期间生成的所有日志都会自动转到 Log Analytics。

Python 在支持使用 Spark 配置的 Log4j 的自定义日志记录消息时存在限制。 只能从驱动程序节点发送日志,因为执行程序节点无权从 Python 访问 Java 虚拟机。

运行示例应用程序

监视库包含一个演示如何将应用程序指标和应用程序日志发送至 Azure Monitor 的示例应用程序。 要运行该示例:

  1. 按照 GitHub 自述文件中所述,在监视库中构建 spark-jobs 项目。

  2. 按照此处所述,导航至 Databricks 工作区并创建新作业。

  3. 在作业详细信息页中,选择“设置 JAR”。

  4. /src/spark-jobs/target/spark-jobs-1.0-SNAPSHOT.jar 上传 JAR 文件。

  5. 对于 Main 类,请输入 com.microsoft.pnp.samplejob.StreamingQueryListenerSampleJob

  6. 选择一个已经过配置,使用监视库的群集。 请参阅配置 Azure Databricks 以将指标发送至 Azure Monitor

作业运行时,可以在 Log Analytics 工作区中查看应用程序日志和指标。

应用程序日志显示在 SparkLoggingEvent_CL 下:

SparkLoggingEvent_CL | where logger_name_s contains "com.microsoft.pnp"

应用程序指标显示在 SparkMetric_CL 下:

SparkMetric_CL | where name_s contains "rowcounter" | limit 50

重要

在确认指标显示后,请停止示例应用程序作业。

后续步骤

部署此代码库随附的性能监视仪表板,以排查 Azure Databricks 生产工作负荷中的性能问题。