Kubernetes 上の Spark の Data Jobs Monitoring

Data Jobs Monitoring は、Kubernetes 上の Apache Spark アプリケーションのパフォーマンスと信頼性を視覚化します。

セットアップ

Data Jobs Monitoring には、Datadog Agent バージョン 7.55.0 以降と Java トレーサーバージョン 1.38.0 以降が必要です。

以下の手順に従って、Kubernetes 上の Spark に対して Data Jobs Monitoring を有効にしてください。

  1. Kubernetes クラスターに Datadog Agent をインストールします。
  2. Spark インスツルメンテーションを注入します。

Datadog Agent を Kubernetes クラスターにインストールする

すでに Datadog Agent を Kubernetes クラスターにインストールしている場合は、Datadog Admission Controller が有効になっていることを確認してください。 確認できたら、次の手順である Spark インスツルメンテーションの注入に進みます。

Datadog Agent は、Datadog Operator または Helm を使用してインストールできます。

前提条件

  • Kubernetes クラスターバージョン v1.20.X 以降
  • Helm
  • The kubectl CLI

インストール

  1. 次のコマンドを実行して、Datadog Operator をインストールします。

    helm repo add datadog https://helm.datadoghq.com
    helm install my-datadog-operator datadog/datadog-operator
    
  2. Datadog の API キーを保存する Kubernetes Secret を作成します。

    kubectl create secret generic datadog-secret --from-literal api-key=<DATADOG_API_KEY> --from-literal app-key=<DATADOG_APP_KEY>
    
  3. 次の構成を含むファイル、datadog-agent.yaml を作成します。

    kind: DatadogAgent
    apiVersion: datadoghq.com/v2alpha1
    metadata:
      name: datadog
    spec:
      features:
        apm:
          enabled: true
          hostPortConfig:
            enabled: true
            hostPort: 8126
        admissionController:
          enabled: true
          mutateUnlabelled: false
      global:
        tags:
          - 'data_workload_monitoring_trial:true'
        site: <DATADOG_SITE>
        credentials:
          apiSecret:
            secretName: datadog-secret
            keyName: api-key
          appSecret:
            secretName: datadog-secret
            keyName: app-key
      override:
        nodeAgent:
          image:
            tag: <DATADOG_AGENT_VERSION>
          env:
            - name: DD_DJM_CONFIG_ENABLED
              value: "true"
    

    <DATADOG_SITE> を、ご使用の Datadog サイトに置き換えます。ご使用のサイトは です (右側で正しいサイトが選択されていることを確認してください)。

    <DATADOG_AGENT_VERSION> をバージョン 7.55.0 以降に置き換えます。

  4. 上記のコンフィギュレーションファイルを使用して Datadog Agent をデプロイします。

    kubectl apply -f /path/to/your/datadog-agent.yaml
    
  1. Datadog の API キーを保存する Kubernetes Secret を作成します。

    kubectl create secret generic datadog-secret --from-literal api-key=<DATADOG_API_KEY> --from-literal app-key=<DATADOG_APP_KEY>
    
  2. 次の構成を含むファイル、datadog-values.yaml を作成します。

    datadog:
      apiKeyExistingSecret: datadog-secret
      appKeyExistingSecret: datadog-secret
      site: <DATADOG_SITE>
      apm:
        portEnabled: true
        port: 8126
      tags:
        - 'data_workload_monitoring_trial:true'
      env:
        - name: DD_DJM_CONFIG_ENABLED
          value: "true"
    
    agents:
      image:
        tag: <DATADOG_AGENT_VERSION>
    
    clusterAgent:
      admissionController:
        enabled: true
        muteUnlabelled: false
    

    <DATADOG_SITE> を、ご使用の Datadog サイトに置き換えます。ご使用のサイトは です (右側で正しいサイトが選択されていることを確認してください)。

    <DATADOG_AGENT_VERSION> をバージョン 7.55.0 以降に置き換えます。

  3. 次のコマンドを実行します。

    helm install <RELEASE_NAME> \
     -f datadog-values.yaml \
     --set targetSystem=<TARGET_SYSTEM> \
     datadog/datadog
    
    • <RELEASE_NAME> をリリース名に置き換えます。例えば、datadog-agent とします’。

    • <TARGET_SYSTEM> を OS 名に置き換えます。例えば、linux または windows とします。

Spark インスツルメンテーションの注入

Spark ジョブを実行する際には、以下の構成を使用します。

spark.kubernetes.{driver,executor}.label.admission.datadoghq.com/enabled (必須)
true
spark.kubernetes.{driver,executor}.annotation.admission.datadoghq.com/java-lib.version (必須)
latest
spark.{driver,executor}.extraJavaOptions
-Ddd.data.jobs.enabled=true (必須)
true
-Ddd.service (オプション)
サービス名です。このオプションは Datadog 内の_ジョブ名_を設定するため、人間が読める名前を使用することをお勧めします。
-Ddd.env (オプション)
proddev などの環境。
-Ddd.version (Optional)
お使いのバージョン。
-Ddd.tags (オプション)
追加したいその他のタグ。<KEY_1>:<VALUE_1>,<KEY_2:VALUE_2> の形式で入力してください。

例: spark-submit

spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master k8s://<CLUSTER_ENDPOINT> \
  --conf spark.kubernetes.container.image=895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.10.0:latest \
  --deploy-mode cluster \
  --conf spark.kubernetes.namespace=<NAMESPACE> \
  --conf spark.kubernetes.authenticate.driver.serviceAccountName=<SERVICE_ACCOUNT> \
  --conf spark.kubernetes.authenticate.executor.serviceAccountName=<SERVICE_ACCOUNT> \
  --conf spark.kubernetes.driver.label.admission.datadoghq.com/enabled=true \
  --conf spark.kubernetes.executor.label.admission.datadoghq.com/enabled=true \
  --conf spark.kubernetes.driver.annotation.admission.datadoghq.com/java-lib.version=latest \
  --conf spark.kubernetes.executor.annotation.admission.datadoghq.com/java-lib.version=latest \
  --conf spark.driver.extraJavaOptions="-Ddd.data.jobs.enabled=true -Ddd.service=<JOB_NAME> -Ddd.env=<ENV> -Ddd.version=<VERSION> -Ddd.tags=<KEY_1>:<VALUE_1>,<KEY_2:VALUE_2>" \
  --conf spark.executor.extraJavaOptions="-Ddd.data.jobs.enabled=true -Ddd.service=<JOB_NAME> -Ddd.env=<ENV> -Ddd.version=<VERSION> -Ddd.tags=<KEY_1>:<VALUE_1>,<KEY_2:VALUE_2>" \
  local:///usr/lib/spark/examples/jars/spark-examples.jar 20

例: AWS start-job-run

aws emr-containers start-job-run \
--virtual-cluster-id <EMR_CLUSTER_ID> \
--name myjob \
--execution-role-arn <EXECUTION_ROLE_ARN> \
--release-label emr-6.10.0-latest \
--job-driver '{
  "sparkSubmitJobDriver": {
    "entryPoint": "s3://BUCKET/spark-examples.jar",
    "sparkSubmitParameters": "--class <MAIN_CLASS> --conf spark.kubernetes.driver.label.admission.datadoghq.com/enabled=true --conf spark.kubernetes.executor.label.admission.datadoghq.com/enabled=true --conf spark.kubernetes.driver.annotation.admission.datadoghq.com/java-lib.version=latest --conf spark.kubernetes.executor.annotation.admission.datadoghq.com/java-lib.version=latest --conf spark.driver.extraJavaOptions=\"-Ddd.data.jobs.enabled=true -Ddd.service=<JOB_NAME> -Ddd.env=<ENV> -Ddd.version=<VERSION> -Ddd.tags=<KEY_1>:<VALUE_1>,<KEY_2:VALUE_2>  --conf spark.executor.extraJavaOptions=\"-Ddd.data.jobs.enabled=true -Ddd.service=<JOB_NAME> -Ddd.env=<ENV> -Ddd.version=<VERSION> -Ddd.tags=<KEY_1>:<VALUE_1>,<KEY_2:VALUE_2>\""
  }
}

検証

Datadog で Data Jobs Monitoring ページを表示すると、すべてのデータ処理ジョブのリストが表示されます。

高度な構成

ランタイムでのタグスパン

ランタイムで Spark スパンにタグを設定できます。これらのタグは、タグが追加された後に開始するスパンにのみ適用されます。

// 次のすべての Spark 計算のタグを追加します
sparkContext.setLocalProperty("spark.datadog.tags.key", "value")
spark.read.parquet(...)

ランタイムタグを削除するには

// 次のすべての Spark 計算のタグを削除します
sparkContext.setLocalProperty("spark.datadog.tags.key", null)

その他の参考資料

お役に立つドキュメント、リンクや記事: