Senden von Azure Databricks-Anwendungsprotokollen an Azure Monitor

Hinweis

In diesem Artikel wird auf eine Open-Source-Bibliothek zurückgegriffen, die auf GitHub unter https://github.com/mspnp/spark-monitoring gehostet wird.

Die ursprüngliche Bibliothek unterstützt Azure Databricks Runtime-Versionen bis Version 10.x (Spark 3.2.x).

Databricks hat eine aktualisierte Version zur Unterstützung von Azure Databricks Runtime-Versionen ab Version 11.0 (Spark 3.3.x) für den Branch l4jv2 unter https://github.com/mspnp/spark-monitoring/tree/l4jv2 bereitgestellt.

Beachten Sie, dass das Release 11.0 aufgrund der unterschiedlichen Protokollierungssysteme, die in Databricks Runtime-Instanzen verwendet werden, nicht abwärtskompatibel ist. Achten Sie darauf, den richtigen Build für Ihre Databricks Runtime-Instanz zu verwenden. Die Bibliothek und das GitHub-Repository befinden sich im Wartungsmodus. Es gibt keine Pläne für weitere Releases, und der Support bei Problemen wird nur bestmöglich bereitgestellt. Wenn Sie weitere Fragen zu der Bibliothek oder zur Roadmap für die Überwachung und Protokollierung Ihrer Azure Databricks-Umgebungen haben, wenden Sie sich an azure-spark-monitoring-help@databricks.com.

In diesem Artikel wird gezeigt, wie Sie Anwendungsprotokolle und Metriken von Azure Databricks an einen Log Analytics-Arbeitsbereich senden können. Dazu wird die Azure Databricks-Überwachungsbibliothek verwendet, die auf GitHub verfügbar ist.

Voraussetzungen

Konfigurieren Sie Ihren Azure Databricks-Cluster zur Verwendung der Überwachungsbibliothek, wie beschrieben in der GitHub-Infodatei.

Hinweis

Die Überwachungsbibliothek streamt Ereignisse auf Apache Spark-Ebene und Metriken für Spark Structured Streaming aus Ihren Aufträgen an Azure Monitor. Für diese Ereignisse und Metriken müssen Sie keine Änderungen an Ihrem Anwendungscode vornehmen.

Senden von Anwendungsmetriken mithilfe von Dropwizard

Spark verwendet ein konfigurierbares System für Metriken, das auf der Dropwizard-Bibliothek für Metriken basiert. Weitere Informationen finden Sie unter Metriken in der Spark-Dokumentation.

Um Anwendungsmetriken aus dem Anwendungscode von Azure Databricks an Azure Monitor zu senden, führen Sie diese Schritte aus:

  1. Erstellen Sie die JAR-Datei spark-listeners-loganalytics-1.0-SNAPSHOT.jar gemäß den Anweisungen in der GitHub-Infodatei.

  2. Erstellen Sie in Ihrem Anwendungscode Dropwizard-Messgeräte oder -Zähler. Sie können die UserMetricsSystem-Klasse verwenden, die in der Überwachungsbibliothek definiert ist. Im folgenden Beispiel wird ein Zähler namens counter1 erstellt.

    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)
      }
    }
    

    Die Überwachungsbibliothek enthält eine Beispielanwendung, die die Verwendung der UserMetricsSystem-Klasse demonstriert.

Senden von Anwendungsprotokollen mit Log4j

Um Ihre Azure Databricks Anwendungsprotokolle mit dem Log4j-Appender in der Bibliothek an Azure Log Analytics zu senden, führen Sie diese Schritte aus:

  1. Erstellen Sie die JAR-Dateien spark-listeners-1.0-SNAPSHOT.jar und spark-listeners-loganalytics-1.0-SNAPSHOT.jar gemäß den Anweisungen in der GitHub-Infodatei.

  2. Erstellen Sie für Ihre Anwendung die Konfigurationsdateilog4j.properties. Fügen Sie die folgenden Konfigurationseigenschaften hinzu. Ersetzen Sie an den angegebenen Stellen den Namen Ihres Anwendungspakets und die Protokollebene:

    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
    

    Eine Beispielkonfigurationsdatei finden Sie hier.

  3. Fügen Sie in Ihren Anwendungscode das Projekt spark-listeners-loganalytics ein, und importieren Sie com.microsoft.pnp.logging.Log4jconfiguration in Ihren Anwendungscode.

    import com.microsoft.pnp.logging.Log4jConfiguration
    
  4. Konfigurieren Sie Log4j mithilfe der Datei log4j.properties, die Sie in Schritt 3 erstellt haben:

    getClass.getResourceAsStream("<path to file in your JAR file>/log4j.properties") {
          stream => {
            Log4jConfiguration.configure(stream)
          }
    }
    
  5. Fügen Sie Apache Spark-Protokollnachrichten nach Bedarf auf der entsprechenden Ebene im Code hinzu. Verwenden Sie beispielsweise die logDebug-Methode, um eine auf Debuggen bezogene Protokollnachricht zu senden. Weitere Informationen finden Sie unter Protokollierung in der Spark-Dokumentation.

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

Hinweis

Wenn Sie die Bibliothek verwenden und über Apache Spark Notebooks verfügen, werden alle Protokolle, die Spark während der Ausführung für das Notebook generiert, automatisch an Log Analytics übergehen.

Es gibt eine Einschränkung für Python bei der Unterstützung benutzerdefinierter Protokollierungsmeldungen mit dem von Spark konfigurierten Log4j. Protokolle können nur vom Treiberknoten gesendet werden, da Executor-Knoten aus Python keinen Zugriff auf den virtuellen Java-Computer haben.

Ausführen der Beispielanwendung

Die Überwachungsbibliothek enthält eine Beispielanwendung, die veranschaulicht, wie sowohl Anwendungsmetriken als auch Anwendungsprotokolle an Azure Monitor gesendet werden. So führen Sie das Beispiel aus:

  1. Erstellen Sie in der Überwachungsbibliothek das Projekt spark-jobs gemäß den Anweisungen in der GitHub-Infodatei.

  2. Wechseln Sie zu Ihrem Databricks-Arbeitsbereich, und erstellen Sie gemäß den Anweisungen hier einen neuen Auftrag.

  3. Wählen Sie auf der Detailseite des Auftrags Set JAR (JAR-Datei festlegen) aus.

  4. Laden Sie die JAR-Datei aus /src/spark-jobs/target/spark-jobs-1.0-SNAPSHOT.jar hoch.

  5. Geben Sie com.microsoft.pnp.samplejob.StreamingQueryListenerSampleJob für Main-Klasse ein.

  6. Wählen Sie einen Cluster aus, der bereits für die Verwendung der Überwachungsbibliothek konfiguriert ist. Siehe Konfigurieren von Azure Databricks zum Senden von Metriken an Azure Monitor.

Nachdem der Auftrag ausgeführt wurde, können Sie die Anwendungsprotokolle und Metriken in Ihrem Log Analytics-Arbeitsbereich anzeigen.

Anwendungsprotokolle werden unter „SparkLoggingEvent_CL“ angezeigt:

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

Anwendungsmetriken werden unter „SparkMetric_CL“ angezeigt:

SparkMetric_CL | where name_s contains "rowcounter" | limit 50

Wichtig

Nachdem Sie bestätigt haben, dass die Metriken angezeigt werden, beenden Sie den Beispielanwendungsauftrag.

Nächste Schritte

Stellen Sie das Dashboard für die Leistungsüberwachung bereit, das diese Codebibliothek begleitet, um Leistungsprobleme in Ihren Azure Databricks-Workloads in der Produktion zu beheben.