Explicación detallada del programador Spark Yarn
1. Selección del programador
Hay tres programadores para elegir en Yarn: Programador FIFO, Programador de capacidad y FairScheduler.
FIFO Scheduler organiza las aplicaciones en una cola en el orden de envío. Esta es una cola de primero en entrar, primero en salir. Al asignar recursos, los recursos se asignan primero a la aplicación en la parte superior de la cola. y luego la aplicación espera la última aplicación. Una vez que se cumplen los requisitos de la aplicación superior, se realizará la siguiente asignación, y así sucesivamente.
FIFO Scheduler es el programador más simple y fácil de entender y no requiere ninguna configuración, pero no es adecuado para clústeres compartidos. Las aplicaciones grandes pueden ocupar todos los recursos del clúster, lo que provoca el bloqueo de otras aplicaciones. En un clúster compartido, es más adecuado utilizar el Programador de capacidad o el Programador justo. Ambos programadores permiten que tareas grandes y pequeñas obtengan ciertos recursos del sistema mientras los envían.
El siguiente "Cuadro comparativo del programador de Yarn" muestra las diferencias entre estos programadores. Como se puede ver en el cuadro, en el programador FIFO, las tareas pequeñas serán bloqueadas por tareas grandes.
Para el programador de capacidad, hay una cola dedicada para ejecutar tareas pequeñas, pero configurar una cola específicamente para tareas pequeñas ocupará una cierta cantidad de recursos del clúster por adelantado, lo que provocará que el tiempo de ejecución de tareas grandes sea mayor. tareas se retrasan cuando se utiliza el programador FIFO.
En el programador Fair, no necesitamos ocupar ciertos recursos del sistema por adelantado. El programador Fair ajustará dinámicamente los recursos del sistema para todos los trabajos en ejecución. Como se muestra en la figura siguiente, cuando se envía el primer trabajo grande, solo este trabajo se está ejecutando y obtiene todos los recursos del clúster; cuando se envía la segunda tarea pequeña, el programador justo asignará la mitad de los recursos a esta pequeña tarea. , permitiendo que estas dos tareas compartan los recursos del clúster de manera justa.
Cabe señalar que en el programador justo de la figura siguiente, habrá un cierto retraso desde el envío de la segunda tarea hasta la adquisición de recursos, porque debe esperar a que se complete la primera tarea. liberar el contenedor ocupado. Una vez completada la tarea pequeña, se liberarán los recursos que ocupaba y la tarea grande obtendrá todos los recursos del sistema. El efecto final es que el programador Fair logra una alta utilización de recursos y garantiza que las pequeñas tareas se completen a tiempo.
Cuadro comparativo del programador de hilo:
2. Configuración del Programador de capacidad (programador de contenedores)
2.1 Introducción a la programación de contenedores
Capacidad El El programador permite que varias organizaciones compartan todo el clúster y cada organización puede obtener una parte de la potencia informática del clúster. Al asignar una cola dedicada a cada organización y luego asignar ciertos recursos del clúster a cada cola, todo el clúster puede proporcionar servicios a múltiples organizaciones configurando múltiples colas. Además, la cola se puede dividir verticalmente, de modo que varios miembros dentro de una organización puedan compartir los recursos de la cola. Dentro de una cola, la programación de recursos adopta la estrategia primero en entrar, primero en salir (FIFO).
De la imagen de arriba, ya sabemos que es posible que un trabajo no utilice los recursos de toda la cola. Sin embargo, si hay varios trabajos ejecutándose en esta cola, si los recursos de esta cola son suficientes, se asignarán a estos trabajos. ¿Qué pasa si los recursos de esta cola no son suficientes? De hecho, el programador de capacidad aún puede asignar recursos adicionales a esta cola. Este es el concepto de "cola elástica" (elasticidad de la cola).
En funcionamiento normal, el programador de Capacidad no forzará la liberación de Contenedores. Cuando los recursos de una cola no son suficientes, esta cola solo puede obtener los recursos de Contenedor liberados por otras colas.
Por supuesto, podemos establecer un uso máximo de recursos para la cola para evitar que esta cola ocupe demasiados recursos inactivos y provoque que otras colas no puedan usar estos recursos inactivos. Aquí es donde se debe sopesar la "cola elástica".
2.2 Configuración de programación de contenedores
Supongamos que tenemos los siguientes niveles de colas:
root
├── prod
└── dev
├── eng
└── science
El siguiente es un archivo de configuración simple del programador de capacidad, el nombre del archivo es capacidad -programador.xml. En esta configuración, se definen dos subcolas prod y dev en la cola raíz, que representan 40 y 60 capacidades respectivamente. Cabe señalar que la configuración de una cola se especifica a través del atributo Yarn.sheduler.capacity..., que representa el árbol de herencia de la cola, como la cola root.prod, que generalmente se refiere a capacidad y capacidad máxima.
Podemos ver que la cola de desarrollo se divide en dos subcolas de la misma capacidad, ingeniería y ciencia. El atributo de capacidad máxima de dev está establecido en 75, por lo que incluso si la cola de producción está completamente inactiva, dev no ocupará todos los recursos del clúster. En otras palabras, la cola de producción todavía tiene 25 recursos disponibles para uso de emergencia. Notamos que el atributo de capacidad máxima no está configurado para las colas de ingeniería y ciencias, lo que significa que los trabajos en la cola de ingeniería o ciencias pueden usar todos los recursos de toda la cola de desarrollo (hasta 75 del clúster). De manera similar, dado que prod no establece el atributo de capacidad máxima, puede ocupar todos los recursos del clúster.
Además de configurar la cola y su capacidad, el contenedor Capacidad también puede configurar la cantidad máxima de recursos que un usuario o aplicación puede asignar, cuántas aplicaciones se pueden ejecutar al mismo tiempo, la autenticación ACL de la cola, etc.
2.3 Configuración de la cola
En cuanto a la configuración de la cola, depende de nuestra aplicación específica. Por ejemplo, en MapReduce, podemos especificar la cola a usar mediante el atributo mapreduce.job.queuename. Si la cola no existe, recibiremos un error al enviar la tarea. Si no definimos ninguna cola, todas las aplicaciones se colocarán en una cola predeterminada.
Nota: Para el programador de capacidad, nuestro nombre de cola debe ser la última parte del árbol de colas; no será reconocido si usamos un árbol de colas. Por ejemplo, en la configuración anterior, está bien que usemos prod y eng como nombres de cola, pero no es válido si usamos root.dev.eng o dev.eng.
3. Configuración de Fair Scheduler (Fair Scheduler)
3.1 Fair Scheduling
El objetivo de diseño del Fair Scheduler es asignar recursos justos a todas las aplicaciones ( La definición de equidad se puede establecer mediante parámetros). El "Cuadro comparativo del programador de Yarn" anterior muestra la programación justa de dos aplicaciones en una cola, por supuesto, la programación justa también puede funcionar en varias colas; Por ejemplo, supongamos que hay dos usuarios A y B, y cada uno de ellos tiene una cola. Cuando A inicia un trabajo y B no tiene tareas, A obtendrá todos los recursos del clúster; cuando B inicia un trabajo, el trabajo de A continuará ejecutándose, pero después de un tiempo, las dos tareas obtendrán cada una la mitad de los recursos del clúster.
Si B inicia un segundo trabajo en este momento y otros trabajos aún se están ejecutando, compartirá los recursos de la cola de B con el primer trabajo de B, es decir, los dos trabajos de B se utilizarán para cuatro puntos. mientras que el trabajo de A todavía se utiliza para la mitad de los recursos del clúster. El resultado es que los recursos eventualmente se comparten por igual entre los dos usuarios. El proceso se muestra en la siguiente figura:
3.2 Habilitar el programador justo
El uso del programador se configura a través del parámetro Yarn.resourcemanager.scheduler.class en el sitio Yarn. xml archivo de configuración, el programador de capacidad se utiliza de forma predeterminada. Si queremos utilizar el programador Fair, debemos configurar el nombre completo de la clase FairScheduler en este parámetro: org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler.
3.3 Configuración de la cola
El archivo de configuración del programador Fair se encuentra en el archivo fair-scheduler.xml en la ruta de clase. Esta ruta se puede pasar a través de Yarn.scheduler.fair. .allocation.file Se modifican las propiedades. Si no existe tal archivo de configuración, la estrategia de distribución adoptada por el programador Fair es similar a la introducida en la Sección 3.1: el programador creará automáticamente una cola para el usuario cuando envíe la primera solicitud. El nombre de la cola es el usuario. nombre, y todas las aplicaciones se asignarán a la cola de usuarios correspondiente.
Podemos configurar cada cola en el archivo de configuración y configurar la cola jerárquicamente como el programador de capacidad. Por ejemplo, consulte capacidad-scheduler.xml para configurar fair-scheduler:
La jerarquía de colas se implementa a través de elementos anidados. Todas las colas son hijas de la cola raíz, incluso si no estamos asignados a elementos. En esta configuración, dividimos la cola de desarrollo en dos colas: ingeniería y ciencia.
La cola en el programador justo tiene un atributo de peso (este peso es la definición de equidad) y este atributo se utiliza como base para la programación justa. En este ejemplo, cuando el programador asigna recursos del clúster 40:60 a producción y desarrollo, se considera justo. Las colas de ingeniería y ciencia no tienen pesos definidos y se distribuirán uniformemente. El peso aquí no es un porcentaje. Reemplazamos los 40 y 60 anteriores con 2 y 3 respectivamente, y el efecto es el mismo. Tenga en cuenta que para las colas que se crearon automáticamente por usuario sin un perfil, todavía tienen un peso y un valor de peso de 1.
Cada cola aún puede tener diferentes estrategias de programación. La política de programación predeterminada de la cola se puede configurar a través del elemento de nivel superior. Si no se configura, se utiliza la programación justa de forma predeterminada.
Aunque es un programador justo, aún admite la programación FIFO a nivel de cola. La estrategia de programación de cada cola puede ser anulada por sus elementos internos. En el ejemplo anterior, la cola de producción está diseñada para usar FIFO para la programación, por lo que las tareas enviadas a la cola de producción se pueden ejecutar secuencialmente de acuerdo con las reglas FIFO. Cabe señalar que la programación entre producción y desarrollo sigue siendo una programación justa, y lo mismo ocurre con la ingeniería y la ciencia.
Aunque no se muestra en la configuración anterior, cada cola aún se puede configurar con la ocupación máxima y mínima de recursos y el número máximo de aplicaciones que se pueden ejecutar.
3.4 Configuración de la cola
El programador Fair utiliza un sistema basado en reglas para determinar en qué cola se debe colocar la aplicación. En el ejemplo anterior, el elemento define una lista de reglas, cada una de las cuales se probará una por una hasta que se encuentre una coincidencia.
Por ejemplo, la primera regla especificada en el ejemplo anterior colocará la aplicación en la cola que especifica. Si la aplicación no especifica un nombre de cola o el nombre de la cola no existe, significa que esta regla no coincide y luego la regla. Se probará la siguiente regla. La regla de grupo primario intentará colocar la aplicación en la cola que lleva el nombre del grupo Unix del usuario. Si no existe dicha cola, no se creará la cola y se intentará con la siguiente regla. Cuando no se cumplen todas las reglas anteriores, se activa la regla predeterminada y la aplicación se coloca en la cola dev.eng.
Por supuesto, no necesitamos configurar reglas queuePlacementPolicy, y el programador adoptará las siguientes reglas de forma predeterminada:
Las reglas anteriores se pueden resumir en una oración. La cola está definida con precisión, el usuario creará una cola llamada nombre de cola.
También existe una estrategia de configuración simple que puede colocar todas las aplicaciones en la misma cola (predeterminada), de modo que todas las aplicaciones puedan compartir el clúster por igual en lugar de hacerlo entre usuarios. La definición de esta configuración es la siguiente:
Para lograr las funciones anteriores, también podemos configurar directamente Yarn.scheduler.fair.user-as-default-queue=false sin usar el archivo de configuración, de modo que la aplicación se colocará en la cola predeterminada en lugar de en las colas de nombres de usuarios individuales. Además, también podemos configurar Yarn.scheduler.fair.allow-undeclared-pools=false para que los usuarios no puedan crear colas.
3.5 Prelación
Cuando un trabajo se envía a una cola vacía en un clúster ocupado, el trabajo no se ejecutará inmediatamente, sino que se bloqueará hasta que el trabajo en ejecución libere el sistema. recurso. Para hacer que el tiempo de ejecución de los trabajos enviados sea más predecible (se puede establecer el tiempo de espera), el programador Fair admite la preferencia.
La preferencia permite al programador eliminar los contenedores que ocupan más de su parte de colas de recursos, y estos recursos de contenedor se pueden asignar a colas que deberían disfrutar de estos recursos compartidos. Cabe señalar que la preferencia reducirá la eficiencia de ejecución del clúster porque los contenedores terminados deben volver a ejecutarse.
La función de preferencia se puede habilitar configurando un parámetro global Yarn.scheduler.fair.preemption=true. Además, se utilizan dos parámetros para controlar el tiempo de vencimiento de la preferencia (estos dos parámetros no están configurados de forma predeterminada y es necesario configurar al menos uno para permitir la preferencia del contenedor):
- mínimo tiempo de espera de preferencia de participación
- tiempo de espera de preferencia de participación justa
Si la cola no obtiene la garantía mínima de recursos dentro del tiempo especificado por el tiempo de espera de preferencia de participación mínima, el programador se adelantará a los contenedores. Podemos configurar este tiempo de espera para todas las colas a través del elemento de nivel superior en el archivo de configuración; también podemos configurar elementos dentro del elemento para especificar el tiempo de espera para una determinada cola.
De manera similar, si la cola no obtiene la mitad de los recursos iguales dentro del tiempo de espera de preferencia de participación justa especificado (esta proporción se puede configurar), el programador se adelantará a los contenedores. Este tiempo de espera se puede configurar por separado para todas las colas y una determinada cola a través de elementos de nivel superior y elementos de nivel de elemento. La proporción mencionada anteriormente se puede configurar mediante (configurar todas las colas) y (configurar una cola determinada), y el valor predeterminado es 0,5.