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
- 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.
Compruebe si la UI de YARN es accesible mediante
https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster
.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
Vaya a IU de Ambari > YARN > RESUMEN, compruebe MEMORIA DEL CLÚSTER en ServiceMetrics.
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.
- 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
yspark.driver.cores
. - En el modo de cliente, use
spark.yarn.am.memory+spark.yarn.am.memoryOverhead
yspark.yarn.am.cores
.
- En el modo de clúster, use
Nota
yarn.scheduler.minimum-allocation-mb <= spark.executor.memory+spark.yarn.executor.memoryOverhead <= yarn.scheduler.maximum-allocation-mb
- 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
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 del almacenamiento de datos para Apache Spark
- Optimización del procesamiento de datos para Apache Spark
- Optimización del uso de la memoria para Apache Spark
- Optimización de la configuración de clústeres de HDInsight para Apache 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.