共用方式為


傳送 Azure Databricks 應用程式記錄檔至 Azure 監視器

注意

本文依賴 GitHub 上託管的開源程式庫:https://github.com/mspnp/spark-monitoring

原始程式庫支援 Azure Databricks Runtimes 10.x (Spark 3.2.x) 及更早版本。

Databricks 已在 l4jv2 分支上提供了更新版本以支援 Azure Databricks Runtimes 11.0 (Spark 3.3.x) 及以上版本:https://github.com/mspnp/spark-monitoring/tree/l4jv2

請注意,由於 Databricks Runtime 使用不同的記錄系統,11.0 版本無法與舊版相容。 請務必針對 Databricks Runtime 使用正確的版本。 該程式庫和 GitHub 存放庫處於維護模式。 沒有進一步發行的計劃,並且將盡力提供問題支援。 有關用於監視和記錄 Azure Databricks 環境程式庫或路線圖的其他問題,請聯絡 azure-spark-monitoring-help@databricks.com

本文介紹如何將應用程式記錄和指標從 Azure Databricks 傳送到 Log Analytics 工作區。 它使用 Azure Databricks 監視庫,其可在 GitHub 上取得。

必要條件

設定 Azure Databricks 叢集以使用監視庫,如「GitHub 讀我檔案」中所述。

注意

監視庫會將 Apache Spark 層級事件和 Spark 結構化流程指標從作業串流傳輸到 Azure Monitor。 對於這些事件和指標,您不需要對應用程式程式碼進行任何更改。

使用 Dropwizard 傳送應用程式指標

Spark 使用以 Dropwizard Metrics Library 為基礎的可設定指標系統。 如需更多資訊,請參閱 Spark 文件中的「指標」

若要將應用程式指標從 Azure Databricks 應用程式程式碼傳送至 Azure 監視器,請執行下列步驟:

  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.jarspark-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 Notebook,則 Spark 在執行筆記本期間產生的任何記錄都會自動傳送到 Log Analytics。

Python 在使用 Spark 設定的 Log4j 支援自訂記錄訊息方面存在限制。 記錄只能從驅動程式節點傳送,因為執行程式節點無法從 Python 存取 Java 虛擬機器。

執行範例應用程式

監視庫包含一個範例應用程式,示範如何將應用程式指標和應用程式記錄傳送到 Azure Monitor。 若要執行範例:

  1. 在監視庫中建置 spark-jobs 專案,如 GitHub 讀我檔案中所述。

  2. 導覽至 Databricks 工作區並建立新作業,如「建立和執行 Azure Databricks 作業」中所述。

  3. 在作業詳細資料頁面中,選取「設定 JAR」

  4. /src/spark-jobs/target/spark-jobs-1.0-SNAPSHOT.jar 上傳 JAR 檔案。

  5. 「主要類別」輸入 com.microsoft.pnp.samplejob.StreamingQueryListenerSampleJob

  6. 選擇已設定為使用監視庫的叢集。 請參閱「設定 Azure Databricks 以將指標傳送至 Azure 監視器」

當作業執行時,您可以在 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 工作負載中的效能問題。