Las canalizaciones te permiten especificar las CPUs y la memoria que se le otorgarán al controlador y a cada ejecutor. Puedes configurar recursos en las configuraciones de canalización de Cloud Data Fusion Studio. Para obtener más información, consulta Cómo administrar las configuraciones de canalización.
En esta página, se proporcionan los lineamientos sobre la cantidad de recursos de controlador y ejecutor que debes configurar para tu caso de uso.
Driver
Como el controlador no realiza mucho trabajo, la configuración predeterminada es de 1 CPU y 2 GB. de memoria es suficiente para ejecutar la mayoría de las canalizaciones. Es posible que debas aumentar la memoria para canalizaciones que contienen muchas etapas o esquemas grandes. Como se menciona en Procesamiento paralelo de JOIN, si la canalización se realiza en la memoria , los conjuntos de datos en la memoria también deben caber en la memoria del controlador.
Executor
Ten en cuenta los siguientes lineamientos sobre los recursos de CPU y memoria.
CPU
La cantidad de CPUs asignadas a un ejecutor determina la cantidad de tareas que el ejecutor puede ejecutar en paralelo. Cada partición de datos requiere una tarea para el proceso de administración de recursos. En la mayoría de los casos, es más sencillo establecer la cantidad de CPUs en uno y, en su lugar, enfocarse en ajustar la memoria.
Memoria
Para la mayoría de las canalizaciones, 4 GB de memoria del ejecutor son suficientes para ejecutarse correctamente la canalización. Las uniones de varios terabytes, muy sesgadas, se completaron con 4 GB de memoria del ejecutor Es posible mejorar la velocidad de ejecución si se aumenta la cantidad de memoria, pero esto requiere un conocimiento profundo de tus datos y tu canalización.
Spark divide la memoria en varias secciones. Una sección está reservada para el uso interno de Spark y otra para la ejecución y el almacenamiento.
De forma predeterminada, la sección de almacenamiento y ejecución es aproximadamente el 60% de la memoria total. Propiedad spark.memory.fraction configuration
de Spark (el valor predeterminado es 0.6)
controla este porcentaje. Esta cantidad funciona bien para la mayoría de las cargas de trabajo y
normalmente no necesita ajustarse.
La sección de almacenamiento y ejecución se divide en espacios separados para el almacenamiento y la ejecución. De forma predeterminada, esos espacios son del mismo tamaño, pero puedes
ajustarlos estableciendo spark.memory.storageFraction
(el valor predeterminado es 0.5) como
controlar qué porcentaje del espacio se reserva para el almacenamiento.
El espacio de almacenamiento almacena datos almacenados en caché. El espacio de ejecución almacena los objetos Shuffle, Join, ordenar y agregar datos. Si hay espacio adicional en la sección de ejecución, Spark puede usar una parte para los datos de almacenamiento. Sin embargo, los datos de ejecución nunca usarán parte del espacio de almacenamiento.
Si sabes que tu canalización no almacena datos en caché, puedes reducir fracción para dejar más espacio para los requisitos de ejecución.
Punto a tener en cuenta: memoria de contenedor YARN
La configuración de memoria del ejecutor controla la cantidad de memoria del montón que se otorga al
ejecutores. Spark agrega una cantidad adicional de memoria para la memoria fuera del montón,
se controla mediante la configuración spark.executor.memoryOverhead
, que tiene como valor predeterminado
384 m Esto significa que la cantidad de memoria que YARN reserva para cada ejecutor
mayor al número establecido
en la configuración de recursos de la canalización. Por ejemplo, si configuras la memoria del ejecutor en 2048 M, Spark agrega 384 M a esa cantidad y solicita a YARN un contenedor de 2432 M. Además, YARN redondea el número de solicitud hasta
un múltiplo de yarn.scheduler.increment-allocation-mb
, que su valor predeterminado es el
valor de yarn.scheduler.minimum-allocation-mb
. Si se establece en 512, YARN
redondea los 2,432 m hasta los 2,560 m. Si el valor se establece en 1024, YARN redondea hacia arriba
2,432 m a 3,072 m Es útil tener en cuenta este punto al determinar el tamaño
de cada nodo trabajador en tu clúster.