Azure Databricks アプリケーション ログを Azure Monitor に送信する

Note

この記事は、GitHub でホストされているオープン ソース ライブラリ https://github.com/mspnp/spark-monitoring に依存しています。

元のライブラリでは、Azure Databricks Runtime 10.x (Spark 3.2.x) 以前がサポートされています。

Databricks は、Azure Databricks Runtime 11.0 (Spark 3.3.x) 以降をサポートするように更新されたバージョンを l4jv2 ブランチで提供しました (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 から入手できます。

前提条件

GitHub の readme の説明に従って、監視ライブラリを使うように Azure Databricks クラスターを構成します。

注意

監視ライブラリは、Apache Spark レベル イベントと Spark Structured Streaming メトリックをジョブから Azure Monitor にストリーミングします。 これらのイベントとメトリックのアプリケーション コードに変更を加える必要はありません。

Dropwizard を使用してアプリケーション メトリックを送信する

Spark は、Dropwizard メトリック ライブラリに基づいて構成可能なメトリック システムを使用します。 詳細については、Spark ドキュメントの「Metrics」を参照してください。

アプリケーション メトリックを Azure Databricks のアプリケーション コードから Azure Monitor に送信するには、次の手順を実行します。

  1. GitHub の readme の説明に従って、spark-listeners-loganalytics-1.0-SNAPSHOT.jar JAR ファイルをビルドします。

  2. アプリケーション コードに Dropwizard のゲージまたはカウンターを作成します。 監視ライブラリに定義されている UserMetricsSystem クラスを使用できます。 次の例は、counter1 という名前の VM を作成します。

    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 appender を使用して Azure Databricks のアプリケーション ログを Azure Log Analytics に送信するには、以下の手順を実行します。

  1. GitHub の readme の説明に従って、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 ドキュメントの「Logging」 (ログ) を参照してください。

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

注意

ライブラリを使用していて、Apache Spark Notebooks がある場合、ノートブックの実行中に Spark によって生成されるすべてのログは、自動的に Log Analytics に移動します。

Python では、Spark で構成された Log4j を使用してカスタム ログ メッセージをサポートする制限があります。 Executor ノードは Python から Java 仮想マシンにアクセスできないため、ログはドライバー ノードからのみ送信できます。

サンプル アプリケーションの実行

監視ライブラリには、アプリケーション メトリックとアプリケーション ログの両方を Azure Monitor に送信する方法を示すサンプル アプリケーションが含まれています。 サンプルを実行するには

  1. GitHub の readme の説明に従って、監視ライブラリの spark-jobs プロジェクトをビルドします。

  2. Databricks ワークスペースに移動し、「Azure Databricks ジョブを作成して実行する」の説明に従って、新しいジョブを作成します。

  3. [ジョブの詳細] ページで [JAR の設定] を選択します。

  4. /src/spark-jobs/target/spark-jobs-1.0-SNAPSHOT.jar から JAR ファイルをアップロードします。

  5. [Main クラス] には com.microsoft.pnp.samplejob.StreamingQueryListenerSampleJob を入力します。

  6. 既に監視ライブラリを使用するように構成されているクラスターを選択します。 「メトリックを Azure Monitor に送信するよう Azure Databricks を構成する」を参照してください。

ジョブが実行されると、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 ワークロードのパフォーマンス問題をトラブルシューティングする。