Red de conocimiento de recetas - Recetas caseras - Explicación detallada del programador Spark Yarn

Explicación detallada del programador Spark Yarn

Primero, la elección del programador

Hay tres programadores para elegir en Yarn: programador FIFO, programador de capacidad y programador de mercado.

El planificador FIFO organiza las solicitudes en una cola según el orden de envío, que 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 se asignan a la siguiente aplicación después de cumplir con los requisitos de la aplicación en la parte superior, y así sucesivamente.

El programador FIFO 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 consumir todos los recursos del clúster, lo que provoca el bloqueo de otras aplicaciones. En un clúster compartido * * *, es más adecuado utilizar un programador de capacidad o un programador justo, los cuales permiten que tareas grandes y pequeñas obtengan ciertos recursos del sistema durante el envío.

El "Cuadro comparativo de programadores de Yarn" a continuación muestra las diferencias entre estos programadores. Como se puede ver en la figura, 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 la cola 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 se retrase. la ejecución cuando se utiliza el programador FIFO.

En el programador justo, no necesitamos ocupar ciertos recursos del sistema por adelantado. El programador justo 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 se han obtenido todos los recursos del clúster. Cuando se envía la segunda tarea pequeña, el programador justo asignará la mitad de los recursos; Esta pequeña tarea permite que dos tareas disfruten por igual de los recursos del clúster.

Cabe señalar que en el programador justo que se muestra en la figura siguiente, habrá un cierto retraso desde el envío de la segunda tarea hasta la adquisición de recursos, porque debe esperar la primera tarea. para liberar el contenedor ocupado. Las tareas pequeñas también liberarán los recursos que ocupan después de la ejecución, y las tareas grandes obtendrán todos los recursos del sistema. El resultado final es que el planificador justo no solo puede lograr una alta utilización de recursos, sino también garantizar la finalización oportuna de tareas pequeñas.

Cuadro comparativo del programador de hilos:

En segundo lugar, la configuración del programador de capacidad.

2.1 Introducción a la programación de contenedores

El programador de capacidad permite que varias organizaciones * * * disfruten de todo el clúster, y cada organización puede obtener parte de la potencia informática del clúster. Al asignar una cola especial a cada organización y luego asignar recursos de clúster específicos a cada cola, todo el clúster puede servir a varias organizaciones configurando varias colas. Además, las colas se pueden dividir verticalmente para que varios miembros de una organización puedan * * * disfrutar de los recursos de la cola. En las colas, la programación de recursos se basa en una política de primero en entrar, primero en salir (FIFO).

Ya sabemos por la figura anterior 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 hay suficientes recursos en esta cola, 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 la cola, que es el concepto de "elasticidad de la cola".

En funcionamiento normal, el programador de capacidad no fuerza la liberación de contenedores. Cuando una cola no está llena, la cola solo puede obtener 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 haga que otras colas no puedan usar estos recursos inactivos. Aquí es donde surge la contrapartida de las "colas elásticas".

2.2 Configuración de programación de contenedores

Supongamos que tenemos los siguientes niveles de colas:

Raíz

├──Producto

└──·Dev

├──Empresa de ingeniería

└──Ciencia

El siguiente es el archivo de configuración de un programador de capacidad simple. denominado capacidad-scheduler.xml En esta configuración, se definen dos subcolas prod y dev en la cola raíz, que representan el 40% y el 60% de la capacidad respectivamente.

Cabe señalar que la configuración de la cola está especificada por el atributo Yarn. Scheduler. Capacidad..., que representa el árbol de herencia de la cola, como la cola root.prod, que generalmente se refiere a la capacidad y la capacidad máxima.

Podemos ver que la cola de desarrollo está dividida en dos subcolas con la misma capacidad, ingeniería y ciencia. La propiedad de capacidad máxima de desarrollo está establecida en 75%, por lo que incluso si la cola de producción está completamente inactiva, dev no ocupará todos los recursos del clúster, es decir, la cola de producción todavía tiene el 25% de los recursos disponibles para emergencias. Notamos que el atributo de capacidad máxima no está configurado en las colas de ingeniería y ciencias, lo que significa que los trabajos en las colas de ingeniería o ciencias pueden usar todos los recursos de toda la cola de desarrollo (hasta el 75% del clúster). Del mismo modo, prod puede consumir todos los recursos del clúster porque no tiene establecida la propiedad de capacidad máxima.

El contenedor de capacidad no solo puede configurar la cola y su capacidad, sino también configurar la cantidad máxima de recursos que un usuario o aplicación puede asignar, cuántas aplicaciones se pueden ejecutar simultáneamente, autenticación ACL de la cola, etcétera.

2.3 Configuración de la cola

La configuración de la cola depende de nuestra aplicación específica. Por ejemplo, en MapReduce, podemos especificar la cola a utilizar mediante la propiedad 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 la cola predeterminada.

Nota: Para el programador de capacidad, nuestro nombre de cola debe ser la última parte del árbol de colas; si usamos un árbol de colas, no será reconocido. Por ejemplo, en la configuración anterior, podemos usar prod y eng como nombres de cola, pero si usamos root.dev.eng o dev.eng, no funcionará

En tercer lugar, la configuración de la feria planificador

3.1 Programación justa

El objetivo de diseño del planificador justo es asignar recursos justos a todas las aplicaciones (la definición de equidad se puede establecer a través de parámetros). El "Cuadro comparativo del programador de Yarn" anterior muestra la programación justa para 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 ambos tienen 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 mientras otros trabajos aún se están ejecutando, compartirá los recursos de esta cola con el primer trabajo de B, es decir, los dos trabajos de B usarán una cuarta parte de los recursos del clúster, mientras que el trabajo de A seguirá usando la mitad. de los recursos del cluster. Por lo tanto, los recursos se compartirán equitativamente 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 de clase del administrador de recursos en el sitio de hilo. Archivo de configuración .xml, el programador de capacidad se utiliza de forma predeterminada. Si queremos utilizar FairScheduler, necesitamos configurar el nombre completo de la clase FairScheduler en este parámetro: org. Programador justo de Apache.

3.3 Configuración de la cola

El archivo de configuración del programador justo se encuentra en el archivo fair-scheduler.xml en la ruta de clase y se puede configurar a través del programador hilo. asignación de atributo de archivo Revisar.

Sin este archivo de configuración, la estrategia de asignació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 el usuario envíe la primera solicitud. El nombre de la cola es el nombre de usuario. 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 las colas jerárquicamente como el programador de capacidad. Por ejemplo, consulte capacidad-scheduler.xml para configurar el programador justo:

La jerarquía de colas se implementa a través de elementos anidados. Todas las colas son subcolas de la cola raíz, incluso si no coincidimos con los 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 sirve como base para la programación justa. En este ejemplo, cuando el programador asigna 40:60 de los recursos del clúster a producción y desarrollo, esto se considera justo y las colas de ingeniería y ciencia no tienen pesos definidos, por lo que se distribuirán de manera uniforme. 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 las colas creadas automáticamente por usuarios sin perfil todavía tienen un peso, con un valor de peso de 1.

Cada cola aún puede tener diferentes políticas 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 utilizará la programación justa de forma predeterminada.

Aunque es un programador justo, aún admite la programación FIFO a nivel de cola. La política de programación de cada cola puede ser anulada por sus elementos internos. En el ejemplo anterior, la cola de producción está designada para usar FIFO para la programación, por lo que las tareas enviadas a la cola de producción se pueden ejecutar en el orden de las reglas FIFO. Cabe señalar que la programación entre producción y desarrollo sigue siendo justa, al igual que la programación entre ingeniería y ciencia.

Aunque no se muestra en la configuración anterior, cada cola aún se puede configurar con el uso máximo y mínimo de recursos, así como el número máximo de aplicaciones que se pueden ejecutar.

3.4 Configuración de la cola

El planificador justo utiliza un sistema basado en reglas para determinar en qué cola se debe colocar una 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, si se especifica la primera regla del ejemplo anterior, la aplicación se colocará 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 la regla no coincide y se intenta con la siguiente regla. La regla de grupo primario intentará colocar la aplicación en una cola que lleva el nombre del grupo Unix del usuario. Si no hay cola, pruebe la siguiente regla en lugar de crear una cola. 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 podemos configurar reglas queuePlacementPolicy. El programador adopta las siguientes reglas de forma predeterminada:

Las reglas anteriores se pueden resumir en una oración, a menos que la cola se defina con precisión. El nombre de usuario se utilizará como nombre de cola para crear la cola.

También existe una estrategia de configuración simple que coloca todas las aplicaciones en la misma cola (predeterminada) para que todas las aplicaciones puedan disfrutar del clúster por igual, en lugar de hacerlo entre usuarios. La configuración se define de la siguiente manera:

Para lograr las funciones anteriores, también podemos configurar hilo. planificador justo . usuario-como-default-queue = false sin utilizar un archivo de configuración para que la aplicación se coloque en la cola predeterminada en lugar de en la cola de nombre de usuario. Además, podemos fijar el hilo. planificador .fair .allow-undefinido-pools = false, por lo que los usuarios no pueden 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 recursos del sistema. Para hacer que el tiempo de ejecución de los envíos de trabajos sea más predecible (se pueden establecer tiempos de espera), el programador justo admite la preferencia.

La preferencia permite al programador eliminar 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.

Puedes habilitar la preferencia configurando el parámetro global hilo. Programador. justo. adelantarse = verdadero. Además, hay dos parámetros que controlan el tiempo de vencimiento de la preferencia (estos dos parámetros no están configurados de forma predeterminada, es necesario configurar al menos un parámetro para permitir la preferencia del contenedor):

-Tiempo de espera mínimo de preferencia compartida

-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á al contenedor. 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 el elemento dentro del elemento para especificar el tiempo de espera para la cola.

De manera similar, si una cola no obtiene la mitad de sus recursos iguales dentro del tiempo especificado por el tiempo de espera de preferencia de participación justa (esta proporción es configurable), el programador se adelantará al contenedor. Este tiempo de espera se puede configurar mediante elementos de nivel superior y elementos de nivel de elemento respectivamente para todas las colas y para una cola. La proporción mencionada anteriormente se puede configurar mediante (configurar todas las colas) y (configurar una cola) y el valor predeterminado es 0,5.