Envío de registros de aplicaciones de Azure Databricks a Azure Monitor

Nota

Este artículo se basa en una biblioteca de código abierto hospedada en GitHub en: https://github.com/mspnp/spark-monitoring.

La biblioteca original admite Azure Databricks Runtimes 10.x (Spark 3.2.x) y versiones anteriores.

Databricks ha contribuido a una versión actualizada para admitir Azure Databricks Runtimes 11.0 (Spark 3.3.x) y versiones posteriores en la rama de l4jv2 en: https://github.com/mspnp/spark-monitoring/tree/l4jv2.

Tenga en cuenta que la versión 11.0 no es compatible con versiones anteriores debido a los diferentes sistemas de registro usados en los runtimes de Databricks. Asegúrese de usar la compilación correcta para Databricks Runtime. La biblioteca y el repositorio de GitHub están en modo de mantenimiento. No hay planes para versiones adicionales y el soporte técnico es la mejor opción. Para cualquier pregunta adicional sobre la biblioteca o la hoja de ruta para supervisar y registrar los entornos de Azure Databricks, póngase en contacto con azure-spark-monitoring-help@databricks.com.

En este artículo se muestra cómo enviar registros de aplicación y métricas de Azure Databricks a un área de trabajo de Log Analytics. Para ello se usa la biblioteca de supervisión de Azure Databricks, que está disponible en GitHub.

Requisitos previos

Configure el clúster de Azure Databricks para usar la biblioteca de supervisión, como se describe en el archivo Léame de GitHub.

Nota

La biblioteca de supervisión transmite los eventos de nivel de Apache Spark y las métricas de Spark Structured Streaming de los trabajos a Azure Monitor. No es necesario realizar ningún cambio en el código de aplicación para estos eventos y métricas.

Envío de métricas de aplicación mediante Dropwizard

Spark usa un sistema de métricas configurable basado en la biblioteca de métricas de Dropwizard. Para más información, consulte Metrics (Métricas) en la documentación de Spark.

Para enviar métricas de aplicación desde el código de aplicación de Azure Databricks a Azure Monitor, siga estos pasos:

  1. Compile el archivo JAR spark-listeners-loganalytics-1.0-SNAPSHOT.jar tal y como se describe en el archivo Léame de GitHub.

  2. Cree medidores o contadores de Dropwizard en el código de la aplicación. Puede usar la clase UserMetricsSystem definida en la biblioteca de supervisión. En el ejemplo siguiente se crea un contador denominado 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)
      }
    }
    

    La biblioteca de supervisión incluye una aplicación de ejemplo que muestra cómo utilizar la clase UserMetricsSystem.

Envío de registros de aplicación mediante Log4j

Para enviar los registros de aplicación de Azure Databricks a Azure Log Analytics mediante el appender de Log4j en la biblioteca, siga estos pasos:

  1. Compile los archivos JAR spark-listeners-1.0-SNAPSHOT.jar y spark-listeners-loganalytics-1.0-SNAPSHOT.jar tal y como se describe en el archivo Léame de GitHub.

  2. Cree un archivo de configuración log4j.properties para la aplicación. Incluya las siguientes propiedades de configuración. Sustituya el nombre del paquete de aplicación y el nivel de registro donde se indica:

    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
    

    Puede encontrar un archivo de configuración de ejemplo aquí.

  3. En el código de la aplicación, incluya el proyecto spark-listeners-loganalytics e importe com.microsoft.pnp.logging.Log4jconfiguration al código de la aplicación.

    import com.microsoft.pnp.logging.Log4jConfiguration
    
  4. Configure Log4j con el archivo log4j.properties que creó en el paso 3:

    getClass.getResourceAsStream("<path to file in your JAR file>/log4j.properties") {
          stream => {
            Log4jConfiguration.configure(stream)
          }
    }
    
  5. Agregue los mensajes de registro de Apache Spark en el nivel adecuado en el código según sea necesario. Por ejemplo, use el método logDebug para enviar un mensaje de registro de depuración. Para más información, consulte Logging (Registro) en la documentación de Spark.

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

Nota

Si usa la biblioteca y tiene cuadernos de Apache Spark, los registros que Spark genera durante la ejecución del cuaderno automáticamente van a Log Analytics.

Hay una limitación para que Python admita mensajes de registro personalizados mediante el Log4j configurado de Spark. Los registros solo se pueden enviar desde el nodo de controlador porque los nodos de ejecutor no tienen acceso a la Máquina virtual Java desde Python.

Ejecutar la aplicación de ejemplo

La biblioteca de supervisión incluye una aplicación de ejemplo que muestra cómo enviar tanto métricas de aplicación como registros de aplicación a Azure Monitor. Para ejecutar el ejemplo:

  1. Compile el proyecto spark-jobs en la biblioteca de supervisión, como se describe en el archivo Léame de GitHub.

  2. Vaya al área de trabajo de Databricks y cree un nuevo trabajo, tal y como se describe aquí.

  3. En la página de detalles del trabajo, seleccione Set JAR (Establecer JAR).

  4. Cargue el archivo JAR desde /src/spark-jobs/target/spark-jobs-1.0-SNAPSHOT.jar.

  5. En Clase principal, escriba com.microsoft.pnp.samplejob.StreamingQueryListenerSampleJob.

  6. Seleccione un clúster que ya esté configurado para usar la biblioteca de supervisión. Consulte Configuración de Azure Databricks para que envíe métricas a Azure Monitor.

Cuando se ejecuta el trabajo, puede ver los registros y las métricas de aplicación en el área de trabajo de Log Analytics.

Los registros de aplicación aparecen en SparkLoggingEvent_CL:

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

Las métricas de aplicación aparecen en SparkMetric_CL:

SparkMetric_CL | where name_s contains "rowcounter" | limit 50

Importante

Después de comprobar que las métricas aparecen, detenga el trabajo de aplicación de ejemplo.

Pasos siguientes

Implemente el panel de supervisión de rendimiento que acompaña a esta biblioteca de código para solucionar los problemas de rendimiento de las cargas de trabajo de producción de Azure Databricks.