Guía de ajuste de tamaño del clúster de Azure HDInsight Interactive Query (Hive LLAP)

En este documento se describe el ajuste de tamaño del clúster de HDInsight Interactive Query (clúster Hive LLAP) de una carga de trabajo típica para lograr un rendimiento razonable. Tenga en cuenta que las recomendaciones proporcionadas en este documento son directrices genéricas y las cargas de trabajo específicas pueden necesitar un ajuste específico.

Tipos de VM predeterminadas de Azure para el clúster de HDInsight Interactive Query (LLAP)

Tipo de nodo Instancia Size
Head D13 v2 8 vcpus, RAM de 56 GB, SSD de 400 GB
Trabajo D14 v2 16 vcpus, RAM de 112 GB, SSD de 800 GB
ZooKeeper A4 v2 4 vcpus, RAM de 8 GB, SSD de 40 GB

Nota: Todos los valores de las configuraciones recomendadas se basan en el nodo de trabajo de tipo D14 v2

Configuración:

Clave de configuración Valor recomendado Descripción
yarn.nodemanager.resource.memory-mb 102400 (MB) Memoria total proporcionada, en MB, para todos los contenedores de YARN de un nodo.
yarn.scheduler.maximum-allocation-mb 102400 (MB) La asignación máxima para cada solicitud de contenedor en RM, en MB. Las solicitudes de memoria que superen este valor no surtirán efecto.
yarn.scheduler.maximum-allocation-vcores 12 Número máximo de núcleos de CPU para cada solicitud de contenedor en Resource Manager. Las solicitudes que superen este valor no surtirán efecto.
yarn.nodemanager.resource.cpu-vcores 12 Número de núcleos de CPU por NodeManager que se pueden asignar para contenedores.
yarn.scheduler.capacity.root.llap.capacity 85 (%) Asignación de la capacidad de YARN para la cola de LLAP
tez.am.resource.memory.mb 4096 (MB) Cantidad de memoria en MB que va a usar AppMaster de Tez.
hive.server2.tez.sessions.per.default.queue <number_of_worker_nodes> Número de sesiones de cada cola mencionada en hive.server2.tez.default.queues. Este número corresponde al número de coordinadores de consultas (AM de Tez).
hive.tez.container.size 4096 (MB) Tamaño de contenedor de Tez especificado en MB.
hive.llap.daemon.num.executors 19 Número de ejecutores por demonio de LLAP.
hive.llap.io.threadpool.size 19 Tamaño del grupo de subprocesos para los ejecutores.
hive.llap.daemon.yarn.container.mb 81920 (MB) Memoria total en MB usada por demonios de LLAP individuales (memoria por demonio).
hive.llap.io.memory.size 242688 (MB) Tamaño de caché en MB por demonio de LLAP si la caché del disco SSD está habilitada.
hive.auto.convert.join.noconditionaltask.size 2048 (MB) Tamaño de memoria en MB para realizar la combinación de asignación.

Componentes o arquitectura de LLAP:

`LLAP Architecture/Components`.

Estimaciones de tamaño de demonio de LLAP:

1. Determinación de la asignación de memoria total de YARN para todos los contenedores de un nodo

Configuración: yarn.nodemanager.resource.memory-mb

Este valor indica una suma máxima de memoria en MB que pueden usar los contenedores de YARN en cada nodo. El valor especificado debe ser inferior a la cantidad total de memoria física en ese nodo.
Memoria total de todos los contenedores de YARN de un nodo = (memoria física total – memoria de SO + otros servicios)
Establezca este valor en aproximadamente un 90 % del tamaño de RAM disponible.
Para D14 v2, se recomienda un valor de 102400 MB

2. Determinación de la cantidad máxima de memoria por solicitud de contenedor de YARN

Configuración: yarn.scheduler.maximum-allocation-mb

Este valor indica la asignación máxima para cada solicitud de contenedor en Resource Manager, en MB. Las solicitudes de memoria que superen el valor especificado no surtirán efecto. Resource Manager puede proporcionar memoria a los contenedores en incrementos de yarn.scheduler.minimum-allocation-mb y no puede superar el tamaño especificado por yarn.scheduler.maximum-allocation-mb. El valor especificado no debe ser mayor que la memoria total proporcionada para todos los contenedores en el nodo especificado por yarn.nodemanager.resource.memory-mb.
Para los nodos de trabajo D14 v2, se recomienda un valor de 102400 MB.

3. Determinación de la cantidad máxima de vcores por solicitud de contenedor de YARN

Configuración: yarn.scheduler.maximum-allocation-vcores

Este valor indica el número máximo de núcleos de CPU virtuales para cada solicitud de contenedor en Resource Manager. Si solicita un número mayor de vcores, este valor no surtirá efecto. Esta es una propiedad global del programador de YARN. Para el contenedor del demonio de LLAP, este valor se puede establecer en el 75 % del total de vcores disponibles. El 25 % restante se debe reservar para NodeManager, DataNode y otros servicios que se ejecutan en los nodos de trabajo.
Hay 16 vcores en las máquinas virtuales de D14 v2 y el contenedor de demonio de LLAP puede usar un 75 % de los 16 vcores totales.
Para D14 v2, se recomienda un valor de 12.

4. Número de consultas simultáneas

Configuración: hive.server2.tez.sessions.per.default.queue

Este valor de configuración determina el número de sesiones de Tez que deben iniciarse en paralelo. Estas sesiones de Tez se inician para cada una de las colas especificadas por "hive.server2.tez.default.queues". Corresponde al número de AM de Tez (coordinadores de consultas). Se recomienda que sea el mismo que el número de nodos de trabajo. El número de AM de Tez puede ser mayor que el número de nodos de demonio de LLAP. La responsabilidad principal de los AM de Tez es coordinar la ejecución de la consulta y asignar los fragmentos del plan de consulta a los demonios de LLAP correspondientes para su ejecución. Mantenga este valor como múltiplo de muchos nodos de demonio de LLAP para lograr un mayor rendimiento.

El clúster de HDInsight predeterminado tiene cuatro demonios de LLAP que se ejecutan en cuatro nodos de trabajo, por lo que el valor recomendado es 4.

Control deslizante de la interfaz de usuario de Ambari de la variable de configuración de Hive hive.server2.tez.sessions.per.default.queue:

`LLAP maximum concurrent queries`.

5. Tamaño del maestro de la aplicación Tez y el contenedor de Tez

Configuración: tez.am.resource.memory.mb, hive.tez.container.size

tez.am.resource.memory.mb - define el tamaño del maestro de la aplicación Tez.
Se recomienda un valor de 4096 MB.

hive.tez.container.size: define la cantidad de memoria proporcionada para el contenedor de Tez. Este valor se debe establecer entre el tamaño mínimo de contenedor de YARN (yarn.scheduler.minimum-allocation-mb) y el tamaño máximo del contenedor de YARN (yarn.scheduler.maximum-allocation-mb). Los ejecutores del demonio de LLAP usan este valor para limitar el uso de memoria por ejecutor.
Se recomienda un valor de 4096 MB.

6. Asignación de la capacidad de la cola de LLAP

Configuración: yarn.scheduler.capacity.root.llap.capacity

Este valor indica un porcentaje de la capacidad proporcionada a la cola de LLAP. Las asignaciones de capacidad pueden tener valores diferentes para las distintas cargas de trabajo en función de cómo estén configuradas las colas de YARN. Si la carga de trabajo es de operaciones de solo lectura, configurar esta opción en un máximo del 90 % de la capacidad debería funcionar. Pero si la carga de trabajo es una mezcla de operaciones de actualización, eliminación y combinación con tablas administradas, se recomienda proporcionar un 85 % de la capacidad a la cola de LLAP. Otras tareas, como la compactación, etc., pueden usar el 15 % de capacidad restante para asignar contenedores desde la cola predeterminada. De este modo, las tareas de la cola predeterminada no desautorizarán los recursos de YARN.

En los nodos de trabajo D14 v2, el valor recomendado de la cola de LLAP es 85.
(Para cargas de trabajo de solo lectura, se puede aumentar hasta 90 según sea necesario).

7. Tamaño del contenedor del demonio de LLAP

Configuración: hive.llap.daemon.yarn.container.mb

El demonio de LLAP se ejecuta como un contenedor de YARN en cada nodo de trabajo. El tamaño total de la memoria para el demonio de LLAP depende de los siguientes factores:

  • Configuraciones de tamaño de contenedor de YARN (yarn.scheduler.minimum-allocation-mb, yarn.scheduler.maximum-allocation-mb, yarn.nodemanager.resource.memory-mb)
  • Número de AM de Tez en un nodo
  • Memoria total configurada para todos los contenedores en un nodo y capacidad de la cola de LLAP

La memoria que necesitan los maestros de la aplicación Tez (AM de Tez) se puede calcular de la manera siguiente.
Un AM de Tez actúa como coordinador de consultas, así que el número de AM de Tez debe configurarse basándose en muchas consultas simultáneas que se van a atender. Teóricamente, se puede considerar un AM de Tez por nodo de trabajo. Pero es posible que se vea más de un AM de Tez en un nodo de trabajo. Para fines de cálculo, se da por hecha una distribución uniforme de AM de Tez entre todos los nodos de trabajo o demonio de LLAP. Se recomienda tener 4 GB de memoria por AM de Tez.

Número de AM de Tez = valor especificado por la configuración de Hive hive.server2.tez.sessions.per.default.queue.
Número de nodos de demonio de LLAP = especificado por la variable env num_llap_nodes_for_llap_daemons en la interfaz de usuario de Ambari.
Tamaño de contenedor de AM de Tez = valor especificado por la configuración de Tez tez.am.resource.memory.mb.

Memoria de AM de Tez por nodo = (ceil(Número de AM de Tez / Número de nodos de demonio de LLAP)x Tamaño de contenedor de AM de Tez**)**
En D14 V2, la configuración predeterminada tiene cuatro AM de Tez y cuatro nodos de demonio de LLAP.
Memoria de AM de Tez por nodo = (ceil(4/4) x 4 GB) = 4 GB

La memoria total disponible para la cola de LLAP por nodo de trabajo se puede calcular de la manera siguiente:
Este valor depende de la cantidad total de memoria disponible para todos los contenedores de YARN de un nodo (yarn.nodemanager.resource.memory-mb) y el porcentaje de capacidad configurada para la cola de LLAP (yarn.scheduler.capacity.root.llap.capacity).
Memoria total para la cola de LLAP en el nodo de trabajo = memoria total disponible para todos los contenedores de YARN de un nodo x porcentaje de capacidad para la cola de LLAP.
En D14 v2, este valor es [100 GB x 0,85] = 85 GB.

El tamaño del contenedor del demonio de LLAP se calcula como se indica a continuación:

Tamaño de contenedor de demonio de LLAP = (Memoria total de la cola de LLAP en un nodo de trabajo) – (Memoria de AM de Tez por nodo) - (Tamaño del contenedor maestro del servicio)
Solo hay un maestro de servicio (maestro de aplicación de servicio LLAP) en el clúster generado en uno de los nodos de trabajo. Para fines de cálculo, se considera un maestro de servicio por nodo de trabajo.
En el nodo de trabajo D14 v2, HDI 4.0: el valor recomendado es (85 GB - 4 GB - 1 GB)) = 80 GB

8. Determinación del número de ejecutores por demonio de LLAP

Configuración: hive.llap.daemon.num.executors, hive.llap.io.threadpool.size

hive.llap.daemon.num.executors:
Esta configuración controla el número de ejecutores que pueden ejecutar tareas en paralelo por demonio de LLAP. Este valor depende del número de núcleos virtuales, la cantidad de memoria usada por ejecutor y la cantidad de memoria total disponible por contenedor de demonio de LLAP. El número de ejecutores se puede saturar al 120 % de núcleos virtuales disponibles por nodo de trabajo. Pero debe ajustarse si no cumple los requisitos de memoria según la memoria necesaria por ejecutor y el tamaño de contenedor de demonio de LLAP.

Cada ejecutor es equivalente a un contenedor de Tez y puede consumir 4 GB (tamaño de contenedor de Tez) de memoria. Todos los ejecutores del demonio de LLAP comparten la misma memoria en montón. Si se da por hecho que no todos los ejecutores ejecutan operaciones intensivas de memoria al mismo tiempo, puede considerar el 75 % del tamaño de contenedor de Tez (4 GB) por ejecutor. De este modo, puede aumentar el número de ejecutores si asigna a cada ejecutor menos memoria (por ejemplo, 3 GB) para un mayor paralelismo. Pero se recomienda ajustar este valor a la carga de trabajo de destino.

Hay 16 núcleos virtuales en las VM de D14 v2. En D14 v2, el valor recomendado para el número de ejecutores es (16 núcleos virtuales x 120 %) ~= 19 en cada nodo de trabajo que considere 3 GB por ejecutor.

hive.llap.io.threadpool.size:
Este valor especifica el tamaño del grupo de subprocesos para los ejecutores. Como los ejecutores son fijos tal y como se han especificado, coincide con el número de ejecutores por demonio de LLAP.
En D14 v2, el valor recomendado es 19.

9. Determinación del tamaño de la caché del demonio de LLAP

Configuración: hive.llap.io.memory.size

La memoria del contenedor del demonio de LLAP consta de los siguientes componentes:

  • Capacidad de aumento
  • Memoria de montón usada por los ejecutores (Xmx)
  • Caché en memoria por demonio (su tamaño de memoria fuera del montón, no aplicable cuando la memoria caché de SSD está habilitada)
  • Tamaño de los metadatos de caché en memoria (solo se aplica cuando la memoria caché de SSD está habilitada)

Tamaño de la capacidad de aumento: este tamaño indica una parte de la memoria fuera del montón usada para la sobrecarga de la máquina virtual de Java (metaespacio, pila de subprocesos, estructuras de datos de gc, etc.). Por lo general, esta sobrecarga es aproximadamente el 6 % del tamaño del montón (Xmx). Para ir a lo seguro, este valor se puede calcular como el 6 % del tamaño total de la memoria del demonio de LLAP.
En D14 v2, el valor recomendado es ceil(80 GB x 0,06) ~= 4 GB.

Tamaño del montón (Xmx) : cantidad de memoria en el montón disponible para todos los ejecutores. Tamaño total del montón = Número de ejecutores x 3 GB
En D14 v2, este valor es 19 x 3 GB = 57 GB

Ambari environment variable for LLAP heap size:

`LLAP heap size`.

Si la memoria caché de SSD está deshabilitada, la caché en memoria es la cantidad de memoria que queda después de tomar el tamaño de la capacidad de aumento y el tamaño del montón del tamaño de contenedor del demonio de LLAP.

El cálculo del tamaño de la caché es diferente cuando la memoria caché de SSD está habilitada. Si establece hive.llap.io.allocator.mmap = true, se habilita el almacenamiento en caché de SSD. Si se habilita la memoria caché de SSD, se usará parte de la memoria para almacenar los metadatos de la memoria caché de SSD. Los metadatos se almacenan en memoria y se espera que ocupen aproximadamente el 8 % del tamaño de la caché de SSD.
Tamaño de metadatos en memoria de la caché de SSD = Tamaño de contenedor del demonio de LLAP - (Capacidad de aumento + Tamaño del montón)
En D14 v2, con HDI 4.0, el tamaño de los metadatos en memoria de la caché de SSD = 80 GB - (4 GB + 57 GB) = 19 GB

Dado el tamaño de la memoria disponible para almacenar los metadatos de la memoria caché de SSD, podemos calcular el tamaño de la memoria caché de SSD que se puede admitir.
Tamaño de metadatos en memoria de la caché de SSD = Tamaño de contenedor del demonio de LLAP - (Capacidad de aumento + Tamaño del montón) = 19 GB
Tamaño de la caché de SSD = Tamaño de los metadatos en memoria de la caché de SSD(19 GB) / 0,08 (8 %)

En D14 v2 y HDI 4.0, el tamaño de la caché de SSD recomendado es de 19 GB / 0,08 ~= 237 GB

10. Ajuste de la memoria de combinación de asignación

Configuración: hive.auto.convert.join.noconditionaltask.size

Asegúrese de que tiene hive.auto.convert.join.noconditionaltask habilitado para que este parámetro surta efecto. Esta configuración determina el umbral para la selección de combinación de asignación por parte del optimizador de Hive que considera la saturación de memoria de otros ejecutores para tener más espacio para las tablas hash en memoria con el fin de permitir más conversiones de combinación de asignación. Si se consideran 3 GB por ejecutor, este tamaño se puede saturar a 3 GB, aunque otras operaciones también pueden usar alguna memoria del montón para los búferes de ordenación, los búferes aleatorios, etc.
Así, en D14 v2, con 3 GB de memoria por ejecutor, se recomienda establecer este valor en 2048 MB.

(Nota: Este valor puede necesitar ajustes adecuados para la carga de trabajo. Si se establece este valor demasiado bajo, no se podrá usar la característica de conversión automática; establecerlo demasiado alto puede dar lugar a excepciones de falta de memoria o pausas de GC que causen errores de funcionamiento).

11. Número de demonios de LLAP

Variables de entorno de Ambari: num_llap_nodes, num_llap_nodes_for_llap_daemons

_num_llap_nodes: especifica el número de nodos usados por el servicio LLAP de Hive, y se incluyen los nodos que ejecutan el demonio de LLAP, el maestro de servicio de LLAP y el maestro de aplicación de Tez (AM de Tez).

`Number of Nodes for LLAP service`.
num_llap_nodes_for_llap_daemons - número especificado de nodos usados solo para demonios de LLAP. Los tamaños de contenedor de demonio de LLAP se establecen en el nodo de ajuste máximo, lo que da lugar a un demonio de llap en cada nodo.

`Number of Nodes for LLAP daemons`.

Se recomienda que ambos valores sean iguales al número de nodos de trabajo en el clúster de Interactive Query.

Consideraciones para la administración de cargas de trabajo

Si quiere habilitar la administración de cargas de trabajo de LLAP, asegúrese de reservar capacidad suficiente para que esta funcione según lo previsto. La administración de cargas de trabajo requiere la configuración de una cola de YARN personalizada, además de la cola de llap. Asegúrese de dividir la capacidad total de los recursos de clúster entre la cola de llap y la cola de administración de cargas de trabajo según los requisitos de carga de trabajo. La administración de cargas de trabajo genera los maestros de aplicación de Tez (AM de Tez) cuando se activa un plan de recursos.

Nota:

  • Los AM de Tez generados mediante la activación de un plan de recursos consumen recursos de la cola de administración de cargas de trabajo como se especifica en hive.server2.tez.interactive.queue.
  • El número de AM de Tez depende del valor de QUERY_PARALLELISM especificado en el plan de recursos.
  • Una vez que la administración de cargas de trabajo está activa, no se usan los AM de Tez de la cola de LLAP. Solo se usan los de la cola de administración de cargas de trabajo para la coordinación de consultas. Los AM de Tez de la cola de llap se usan cuando la administración de cargas de trabajo está deshabilitada.

Por ejemplo: Capacidad total del clúster = 100 GB de memoria divididos entre las colas de LLAP, administración de cargas de trabajo y predeterminadas como se indica a continuación:

  • Capacidad de la cola de LLAP = 70 GB
  • Capacidad de la cola de administración de cargas de trabajo = 20 GB
  • Capacidad de la cola predeterminada = 10 GB

Con 20 GB de capacidad de la cola de administración de cargas de trabajo, un plan de recursos puede especificar el valor QUERY_PARALLELISM como cinco, lo que significa que la administración de cargas de trabajo puede iniciar cinco AM de Tez con un tamaño de contenedor de 4 GB cada uno. Si QUERY_PARALLELISM es mayor que la capacidad, puede ver algunos AM de Tez dejen de responder en el estado ACCEPTED. El servidor de Hive 2 interactivo no puede enviar fragmentos de consulta a los AM de Tez que no están en estado RUNNING.

Pasos siguientes

Si con el establecimiento de este valor no se resuelve el problema, elija una de las opciones siguientes: