Optimización de las aplicaciones Apache Spark en HDInsight

En este artículo se proporciona información general sobre las estrategias para optimizar aplicaciones Apache Spark en Azure HDInsight.

Información general

Es posible que se enfrente a los siguientes escenarios comunes.

  • El mismo trabajo de Spark es más lento que antes en el mismo clúster de HDInsight.
  • El trabajo de Spark es más lento en el clúster de HDInsight que en el entorno local u otro proveedor de servicios de terceros.
  • El trabajo de Spark es más lento en un clúster de HDI que otro clúster de HDI.

El rendimiento de los trabajos de Apache Spark depende de varios factores. Entre estos factores de rendimiento se incluyen lo siguiente:

  • Cómo se almacenan los datos
  • Cómo se configura el clúster
  • Las operaciones que se usan al procesar los datos.
  • Servicio YARN incorrecto
  • Restricciones de memoria debido a ejecutores de tamaño incorrecto y OutOfMemoryError
  • Demasiadas tareas o tareas insuficientes
  • La asimetría de datos provocó algunas tareas pesadas o tareas lentas
  • Tareas más lentas en nodos incorrectos

Paso 1: Comprobación del correcto funcionamiento del servicio YARN

  1. Vaya a la interfaz de usuario de Ambari:
  • Compruebe si hay alertas de ResourceManager o NodeManager.
  • Compruebe el estado de ResourceManager y NodeManager en YARN > RESUMEN: todo NodeManager debe estar en Iniciado y solo Active ResourceManager debe estar en Iniciado.
  1. Compruebe si la UI de YARN es accesible mediante https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster.

  2. Compruebe si hay excepciones o errores en el inicio de sesión de ResourceManager /var/log/hadoop-yarn/yarn/hadoop-yarn-resourcemanager-*.log.

Consulte más información en Problemas comunes de YARN.

Paso 2: Comparación de los nuevos recursos de aplicación con recursos disponibles de YARN

  1. Vaya a IU de Ambari > YARN > RESUMEN, compruebe MEMORIA DEL CLÚSTER en ServiceMetrics.

  2. Compruebe las métricas de cola de YARN en detalles:

  • Vaya a la interfaz de usuario de YARN y compruebe las métricas del programador de YARN mediante https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster/scheduler.
  • También, puede comprobar las métricas del programador de YARN mediante la API de REST de YARN. Por ejemplo, curl -u "xxxx" -sS -G "https://YOURCLUSTERNAME.azurehdinsight.net/ws/v1/cluster/scheduler". Para ESP, debe usar el usuario administrador de dominio.
  1. Calcule los recursos totales de la nueva aplicación.
  • Todos los recursos de ejecutores: spark.executor.instances * (spark.executor.memory + spark.yarn.executor.memoryOverhead) and spark.executor.instances * spark.executor.cores. Consulte más información sobre la configuración de ejecutores de Spark.
  • ApplicationMaster
    • En el modo de clúster, use spark.driver.memory y spark.driver.cores.
    • En el modo de cliente, use spark.yarn.am.memory+spark.yarn.am.memoryOverhead y spark.yarn.am.cores.

Nota

yarn.scheduler.minimum-allocation-mb <= spark.executor.memory+spark.yarn.executor.memoryOverhead <= yarn.scheduler.maximum-allocation-mb

  1. Compare los nuevos recursos totales de la aplicación con los recursos disponibles de YARN en la cola especificada.

Paso 3: Seguimiento de la aplicación Spark

  1. Supervisión de la aplicación Spark en ejecución mediante la interfaz de usuario de Spark

  2. Supervisión de la aplicación Spark completa o incompleta mediante la interfaz de usuario del servidor de historial de Spark

Es necesario identificar los síntomas siguientes mediante la interfaz de usuario de Spark o la interfaz de usuario del historial de Spark:

  • ¿Qué fase es lenta?
  • ¿Se usa completamente el total de núcleos virtuales de CPU del ejecutor en la escala de tiempo en la pestaña Fase?
  • Si usa Spark SQL, ¿cuál es el plan físico en la pestaña SQL?
  • ¿DAG es demasiado largo en una fase?
  • Observe las métricas de las tareas (tamaño de entrada, tamaño de escritura aleatoria, tiempo de GC) en la pestaña Fase.

Consulte más información en Supervisión de aplicaciones Spark.

Paso 4: Optimización de la aplicación Spark

Hay muchas optimizaciones que pueden ayudarle a superar estas dificultades, como el almacenamiento en caché y la posibilidad de sesgar los datos.

En cada uno de los siguientes artículos, puede encontrar información sobre diferentes aspectos de la optimización de Spark.

Optimización de las particiones de Spark SQL

  • El valor de spark.sql.shuffle.paritions es 200 de manera predeterminada. Podemos hacer un ajuste en función de las necesidades empresariales cuando se ordenan aleatoriamente datos para combinaciones o agregaciones.
  • El valor de spark.sql.files.maxPartitionBytes es 1G de manera predeterminada en HDI. Número máximo de bytes que se van a empaquetar en una sola partición al leer archivos. Esta configuración solo es efectiva cuando se usan orígenes basados en archivos como Parquet, JSON y ORC.
  • AQE en Spark 3.0. Consulte Ejecución de consultas adaptables.

Pasos siguientes