Data Jobs Monitoring para Spark en Kubernetes

Este producto no es compatible con el sitio Datadog seleccionado. ().

Data Jobs Monitoring ofrece visibilidad del rendimiento y la fiabilidad de las aplicaciones Apache Spark en Kubernetes.

Ajustes

Data Jobs Monitoring requiere el Datadog Agent versión 7.55.0 o posterior y el rastreador de Java versión 1.38.0 o posterior.

Sigue estos pasos para habilitar Data Jobs Monitoring para Spark en Kubernetes.

  1. Instalar el Datadog Agent en tu clúster de Kubernetes.
  2. Inyectar la instrumentación de Spark.

Instalar el Datadog Agent en tu clúster de Kubernetes

Si ya has instalado el Datadog Agent en tu clúster de Kubernetes, asegúrate de que has habilitado el Datadog Admission Controller. A continuación, puedes ir al siguiente paso, Inyectar la instrumentación de Spark.

Puedes instalar el Datadog Agent utilizando el Datadog Operador o Helm.

Requisitos previos

Instalación

  1. Instala el Datadog Operator ejecutando los siguientes comandos:

    helm repo add datadog https://helm.datadoghq.com
    helm install my-datadog-operator datadog/datadog-operator
    
  2. Crea un secreto de Kubernetes para almacenar tu clave de API de Datadog.

    kubectl create secret generic datadog-secret --from-literal api-key=<DATADOG_API_KEY>
    

    Sustituye <DATADOG_API_KEY> por tu clave de API de Datadog.

  3. Crea un archivo, datadog-agent.yaml, que contenga la siguiente configuración:

    kind: DatadogAgent
    apiVersion: datadoghq.com/v2alpha1
    metadata:
      name: datadog
    spec:
      features:
        apm:
          enabled: true
          hostPortConfig:
            enabled: true
            hostPort: 8126
        admissionController:
          enabled: true
          mutateUnlabelled: false
        # (Optional) Uncomment the next three lines to enable logs collection
        # logCollection:
          # enabled: true
          # containerCollectAll: true
      global:
        site: <DATADOG_SITE>
        credentials:
          apiSecret:
            secretName: datadog-secret
            keyName: api-key
      override:
        nodeAgent:
          image:
            tag: <DATADOG_AGENT_VERSION>
    

    Sustituye <DATADOG_SITE> por tu sitio de Datadog. Tu sitio es . (Asegúrate de seleccionar el SITIO correcto a la derecha).

    Sustituye <DATADOG_AGENT_VERSION> por la versión 7.55.0 o posterior.

    Opcional: Anula los comentarios de la sección logCollection para comenzar a recopilar logs de aplicación que se correlacionarán con las trazas de ejecución del trabajo de Spark. Una vez habilitados, los logs se recopilan de todos los contenedores detectados por defecto. Consulta la documentación de recopilación d elogs de Kubernetes para más detalles sobre el proceso de configuración.

  4. Despliega el Datadog Agent con el archivo de configuración anterior:

    kubectl apply -f /path/to/your/datadog-agent.yaml
    
  1. Crea un secreto de Kubernetes para almacenar tu clave de API de Datadog.

    kubectl create secret generic datadog-secret --from-literal api-key=<DATADOG_API_KEY>
    

    Sustituye <DATADOG_API_KEY> por tu clave de API de Datadog.

  2. Crea un archivo, datadog-values.yaml, que contenga la siguiente configuración:

    datadog:
      apiKeyExistingSecret: datadog-secret
      site: <DATADOG_SITE>
      apm:
        portEnabled: true
        port: 8126
      # (Optional) Uncomment the next three lines to enable logs collection
      # logs:
        # enabled: true
        # containerCollectAll: true
    
    agents:
      image:
        tag: <DATADOG_AGENT_VERSION>
    
    clusterAgent:
      admissionController:
        enabled: true
        muteUnlabelled: false
    

    Sustituye <DATADOG_SITE> por tu sitio de Datadog. Tu sitio es . (Asegúrate de seleccionar el SITIO correcto a la derecha).

    Sustituye <DATADOG_AGENT_VERSION> por la versión 7.55.0 o posterior.

    Opcional: Anula los comentarios de la sección de logs para comenzar a recopilar logs de aplicación que se correlacionarán con las trazas de ejecución del trabajo de Spark. Una vez habilitados, los logs se recopilan de todos los contenedores detectados por defecto. Consulta la documentación de recopilación d elogs de Kubernetes para más detalles sobre el proceso de configuración.

  3. Ejecuta el siguiente comando:

    helm install <RELEASE_NAME> \
     -f datadog-values.yaml \
     --set targetSystem=<TARGET_SYSTEM> \
     datadog/datadog
    
    • Sustituye <RELEASE_NAME> por el nombre de tu versión. Por ejemplo, datadog-agent.

    • Sustituye <TARGET_SYSTEM> por el nombre de tu sistema operativo. Por ejemplo, linux o windows.

Inyectar la instrumentación de Spark

Cuando ejecutes tu trabajo de Spark, utiliza las siguientes configuraciones:

spark.kubernetes.{driver,executor}.label.admission.datadoghq.com/enabled (obligatorio)
true
spark.kubernetes.{driver,executor}.annotation.admission.datadoghq.com/java-lib.version (obligatorio)
latest
spark.{driver,executor}.extraJavaOptions
-Ddd.data.jobs.enabled=true (obligatorio) : true

-Ddd.service (opcional) : tu nombre de servicio. Debido a que esta opción establece el nombre de trabajo en Datadog, es recomendado que utilices un nombre legible por humanos.

-Ddd.env (opcional) : tu entorno, como prod o dev.

-Ddd.version (opcional) : tu versión.

-Ddd.tags (opcional) Otras etiquetas que desees añadir, en el formato <KEY_1>:<VALUE_1>,<KEY_2:VALUE_2>.

Ejemplo: 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

Ejemplo: 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>\""
  }
}

Validación

En Datadog, consulta la página Data Jobs Monitoring para ver una lista de todos tus trabajos de procesamiento de datos.

Configuración avanzada

Etiquetar tramos (spans) en tiempo de ejecución

You can set tags on Spark spans at runtime. These tags are applied only to spans that start after the tag is added.

// Add tag for all next Spark computations
sparkContext.setLocalProperty("spark.datadog.tags.key", "value")
spark.read.parquet(...)

To remove a runtime tag:

// Remove tag for all next Spark computations
sparkContext.setLocalProperty("spark.datadog.tags.key", null)

Referencias adicionales

Más enlaces, artículos y documentación útiles: