Guia de dimensionamento do Azure HDInsight Interactive Query Cluster (Hive LLAP)

Este documento descreve o dimensionamento do Cluster de Consulta Interativa do HDInsight (cluster LLAP do Hive) para uma carga de trabalho típica para obter um desempenho razoável. Observe que as recomendações fornecidas neste documento são diretrizes genéricas e cargas de trabalho específicas podem precisar de ajustes específicos.

Tipos de VM padrão do Azure para o cluster de consulta interativo do HDInsight (LLAP)

Tipo de Nó Instância Tamanho
Head D13 v2 vcpus8, 56 GB de RAM, 400 GB SSD
Trabalhador D14 v2 16 vcpus, 112 GB de RAM, 800 GB SSD
ZooKeeper A4 v2 vcpus4, 8 GB de RAM, 40 GB SSD

Nota: Todos os valores de configuração recomendados são baseados no nó de trabalho do tipo D14 v2

Configuração:

Chave de configuração Valor recomendado Description
yarn.nodemanager.resource.memory-mb 102400 (MB) Memória total fornecida, em MB, para todos os contêineres YARN em um nó
yarn.scheduler.maximum-alocação-mb 102400 (MB) A alocação máxima para cada solicitação de contêiner no RM, em MBs. Solicitações de memória superiores a esse valor não terão efeito
yarn.scheduler.maximum-allocation-vcores 12 O número máximo de núcleos de CPU para cada solicitação de contêiner no Gerenciador de Recursos. Solicitações superiores a esse valor não terão efeito.
yarn.nodemanager.resource.cpu-vcores 12 Número de núcleos de CPU por NodeManager que podem ser alocados para contêineres.
yarn.scheduler.capacity.root.llap.capacity 85 (%) Alocação de capacidade YARN para fila LLAP
tez.am.resource.memory.mb 4096 (MB) A quantidade de memória em MB a ser usada pelo tez AppMaster
hive.server2.tez.sessions.per.default.queue <number_of_worker_nodes> O número de sessões para cada fila nomeada nas filas hive.server2.tez.default. Este número corresponde ao número de coordenadores de consulta (Tez AMs)
hive.tez.container.size 4096 (MB) Tamanho especificado do recipiente Tez em MB
hive.llap.daemon.num.executors 19 Número de executores por daemon LLAP
hive.llap.io.threadpool.size 19 Tamanho do pool de threads para executores
hive.llap.daemon.yarn.container.mb 81920 (MB) Memória total em MB usada por daemons LLAP individuais (Memória por daemon)
hive.llap.io.memory.size 242688 (MB) Tamanho do cache em MB por daemon LLAP desde que o cache SSD esteja ativado
hive.auto.convert.join.noconditionaltask.size 2048 (MB) tamanho da memória em MB para fazer Map Join

Arquitetura/componentes LLAP:

`LLAP Architecture/Components`.

Estimativas de tamanho do LLAP Daemon:

1. Determinando a alocação total de memória YARN para todos os contêineres em um nó

Configuração: yarn.nodemanager.resource.memory-mb

Esse valor indica uma soma máxima de memória em MB que pode ser usada pelos contêineres YARN em cada nó. O valor especificado deve ser menor do que a quantidade total de memória física nesse nó.
Memória total para todos os contêineres YARN em um nó = (Memória física total – memória para SO + Outros serviços)
Defina esse valor como ~90% do tamanho da RAM disponível.
Para D14 v2, o valor recomendado é 102400 MB. 

2. Determinação da quantidade máxima de memória por solicitação de contêiner YARN

Configuração: yarn.scheduler.maximum-allocation-mb

Esse valor indica a alocação máxima para cada solicitação de contentor no Gestor de Recursos, em MB. Solicitações de memória superiores ao valor especificado não terão efeito. O Resource Manager pode fornecer memória a contêineres em incrementos de yarn.scheduler.minimum-allocation-mb e não pode exceder o tamanho especificado por yarn.scheduler.maximum-allocation-mb. O valor especificado não deve ser maior do que o total de memória fornecida para todos os contêineres no nó especificado por yarn.nodemanager.resource.memory-mb.
Para nós de trabalho D14 v2, o valor recomendado é 102400 MB

3. Determinação da quantidade máxima de pedido de contentor YARN vcores por YARN

Configuração: yarn.scheduler.maximum-allocation-vcores

Esse valor indica o número máximo de núcleos de CPU virtual para cada solicitação de contentor no Gestor de Recursos. Solicitar um número maior de vcores então esse valor não terá efeito. É uma propriedade global do agendador YARN. Para o recipiente de daemon LLAP, esse valor pode ser definido como 75% do total disponível vcores. Os 25% restantes devem ser reservados para NodeManager, DataNode e outros serviços em execução nos nós de trabalho.
16 vcores Existem VMs D14 v2 e 75% do total 16 vcores pode ser usado pelo contêiner de daemon LLAP.
Para D14 v2, o valor recomendado é 12.

4. Número de consultas simultâneas

Configuração: hive.server2.tez.sessions.per.default.queue

Esse valor de configuração determina o número de sessões Tez que podem ser iniciadas em paralelo. Essas sessões Tez são iniciadas para cada uma das filas especificadas por "hive.server2.tez.default.queues". Corresponde ao número de Tez AMs (Coordenadores de Consulta). Recomenda-se que seja o mesmo que o número de nós de trabalho. O número de Tez AMs pode ser maior do que o número de nós daemon LLAP. A principal responsabilidade do Tez AM é coordenar a execução da consulta e atribuir fragmentos do plano de consulta aos daemons LLAP correspondentes para execução. Mantenha esse valor como múltiplo de muitos nós de daemon LLAP para obter uma taxa de transferência mais alta.

O cluster HDInsight padrão tem quatro daemons LLAP em execução em quatro nós de trabalho, portanto, o valor recomendado é 4.

Controle deslizante Ambari UI para variável hive.server2.tez.sessions.per.default.queuede configuração do Hive:

`LLAP maximum concurrent queries`.

5. Tamanho mestre do recipiente Tez e da aplicação Tez

Configuração: tez.am.resource.memory.mb, hive.tez.container.size

tez.am.resource.memory.mb - define o tamanho do Tez Application Master.
O valor recomendado é 4096 MB.

hive.tez.container.size - define a quantidade de memória fornecida para o recipiente Tez. Esse valor deve ser definido entre o tamanho mínimo do contêiner YARN(yarn.scheduler.minimum-allocation-mb) e o tamanho máximo do contêiner YARN(yarn.scheduler.maximum-allocation-mb). Os executores do daemon LLAP utilizam esse valor para limitar o uso de memória por executor.
O valor recomendado é 4096 MB.

6. Alocação de capacidade da fila LLAP

Configuração: yarn.scheduler.capacity.root.llap.capacity

Esse valor indica uma percentagem da capacidade dada à fila LLAP. As alocações de capacidade podem ter valores diferentes para volumes de trabalho diferentes, dependendo de como as filas YARN são configuradas. Se a seu volume de trabalho for operações somente leitura, defini-la como 90% da capacidade deve funcionar. No entanto, se o seu volume de trabalho for uma mistura de operações de atualização/eliminação/fusão utilizando tabelas geridas, recomenda-se que atribua 85% da capacidade à fila LLAP. Os restantes 15% de capacidade podem ser utilizados por outras tarefas, como a compactação, etc., para atribuir contentores da fila de espera predefinida. Dessa forma, as tarefas na fila padrão não privarão os recursos do YARN.

Para nós de trabalho D14v2, o valor recomendado para fila LLAP é 85.
(Para cargas de trabalho somente leitura, ele pode ser aumentado até 90 conforme adequado.)

7. Tamanho do recipiente do daemon LLAP

Configuração: hive.llap.daemon.yarn.container.mb

O daemon LLAP é executado como um contêiner YARN em cada nó de trabalho. O tamanho total da memória para o recipiente de daemon LLAP depende dos seguintes fatores,

  • Configurações do tamanho do contêiner YARN (yarn.scheduler.minimum-allocation-mb, yarn.scheduler.maximum-allocation-mb, yarn.nodemanager.resource.memory-mb)
  • Número de Tez AMs em um nó
  • Memória total configurada para todos os contêineres em um nó e capacidade de fila LLAP

A memória necessária para Tez Application Masters (Tez AM) pode ser calculada da seguinte forma.
Tez AM atua como um coordenador de consulta e o número de Tez AMs deve ser configurado com base em muitas consultas simultâneas a serem atendidas. Teoricamente, podemos considerar um Tez AM por nó de trabalhador. No entanto, é possível que você veja mais de um Tez AM em um nó de trabalho. Para fins de cálculo, assumimos a distribuição uniforme de Tez AMs em todos os nós daemon LLAP/nós de trabalho. Recomenda-se ter 4 GB de memória por Tez AM.

Número de Tez Ams = valor especificado pelo Hive config hive.server2.tez.sessions.per.default.queue.
Número de nós daemon LLAP = especificado pela variável env num_llap_nodes_for_llap_daemons na interface do usuário do Ambari.
Tez AM container size = valor especificado por Tez config tez.am.resource.memory.mb.

Tez AM memory per node = (ceil(Number of Tez AMs / Number of LLAP daemon node)x Tez AM container size**)**
Para D14 v2, a configuração padrão tem quatro Tez AMs e quatro nós daemon LLAP.
Tez AM memória por nó = (ceil(4/4) x 4 GB) = 4 GB

A memória total disponível para fila LLAP por nó de trabalho pode ser calculada da seguinte forma:
Esse valor depende da quantidade total de memória disponível para todos os contêineres YARN em um nó (yarn.nodemanager.resource.memory-mb) e da porcentagem de capacidade configurada para fila LLAP (yarn.scheduler.capacity.root.llap.capacity).
Total de memória para fila LLAP no nó de trabalho = Total de memória disponível para todos os contêineres YARN em um nó x Porcentagem de capacidade para fila LLAP.
Para D14 v2, esse valor é (100 GB x 0,85) = 85 GB.

O tamanho do recipiente do daemon LLAP é calculado da seguinte forma;

Tamanho do contêiner do daemon LLAP = (Total de memória para fila LLAP em um nó de trabalho) – (Tez AM memory per node) - (Service Master container size)
Há apenas um Service Master (Application Master for LLAP service) no cluster gerado em um dos nós de trabalho. Para fins de cálculo, consideramos um mestre de serviço por nó de trabalhador.
Para o nó de trabalho D14 v2, HDI 4.0 - o valor recomendado é (85 GB - 4 GB - 1 GB)) = 80 GB

8. Determinação do número de executores por daemon LLAP

Configuração: hive.llap.daemon.num.executors, hive.llap.io.threadpool.size

hive.llap.daemon.num.executors:
Essa configuração controla o número de executores que podem executar tarefas em paralelo por daemon LLAP. Esse valor depende do número de vcores, da quantidade de memória utilizada por executor e da quantidade de memória total disponível para o recipiente de daemon LLAP. O número de executores pode ser sobreinscrito para 120% dos vcores disponíveis por nó de trabalho. No entanto, ele deve ser ajustado se não atender aos requisitos de memória com base na memória necessária por executor e no tamanho do contêiner do daemon LLAP.

Cada executor é equivalente a um contentor Tez e pode consumir 4 GB (tamanho do contentor Tez) de memória. Todos os executores no daemon LLAP compartilham a mesma memória de pilha. Com a suposição de que nem todos os executores executam operações com uso intensivo de memória ao mesmo tempo, pode considerar 75% do tamanho do contentor Tez (4 GB) por executor. Desta forma, pode aumentar o número de executores, dando a cada executor menos memória (por exemplo, 3 GB) para aumentar o paralelismo. No entanto, é recomendável ajustar essa configuração para sua carga de trabalho de destino.

Existem 16 vcores em VMs D14 v2. Para D14 v2, o valor recomendado para um de executores é (16 vcores x 120%) ~= 19 em cada nó de trabalho considerando 3 GB por executor.

hive.llap.io.threadpool.size:
Esse valor especifica o tamanho do pool de threads para executores. Como os executores são fixos conforme especificado, é o mesmo que o número de executores por daemon LLAP.
Para D14 v2, o valor recomendado é 19.

9. Determinando o tamanho do cache do daemon LLAP

Configuração: hive.llap.io.memory.size

A memória de contêiner de daemon LLAP consiste nos seguintes componentes;

  • Sala de cabeceira
  • Memória de pilha usada por executores (Xmx)
  • Cache na memória por daemon (seu tamanho de memória off-heap, não aplicável quando o cache SSD está ativado)
  • Tamanho dos metadados da cache na memória (aplicável apenas quando a cache SSD está ativada)

Tamanho do headroom: esse tamanho indica uma parte da memória off-heap usada para a sobrecarga da Java VM (metaespaço, pilha de threads, gc estruturas de dados, etc.). Geralmente, essa sobrecarga é de cerca de 6% do tamanho da pilha (Xmx). Para estar no lado mais seguro, esse valor pode ser calculado como 6% do tamanho total da memória daemon LLAP.
Para D14 v2, o valor recomendado é ceil(80 GB x 0,06) ~= 4 GB.

Tamanho da pilha (Xmx): É a quantidade de memória de pilha disponível para todos os executores. Tamanho total da pilha = Número de executores x 3 GB
Para D14 v2, esse valor é 19 x 3 GB = 57 GB

Ambari environment variable for LLAP heap size:

`LLAP heap size`.

Quando o cache SSD é desativado, o cache na memória é a quantidade de memória que é deixada depois de retirar o tamanho do Headroom e o tamanho do Heap do tamanho do recipiente do daemon LLAP.

O cálculo do tamanho do cache difere quando o cache SSD está ativado. A configuração hive.llap.io.allocator.mmap = true habilita o cache SSD. Quando o cache SSD está ativado, parte da memória será utilizada para armazenar metadados para o cache SSD. Os metadados são armazenados na memória e espera-se que seja ~8% do tamanho do cache SSD.
Tamanho dos metadados na memória do cache SSD = tamanho do recipiente do daemon LLAP - (Sala principal + Tamanho da pilha)
Para D14 v2, com HDI 4.0, tamanho dos metadados na memória do cache SSD = 80 GB - (4 GB + 57 GB) = 19 GB

Dado o tamanho da memória disponível para armazenar metadados de cache SSD, podemos calcular o tamanho do cache SSD que pode ser suportado.
Tamanho dos metadados na memória para cache SSD = tamanho do recipiente do daemon LLAP - (Head room + Heap size) = 19 GB
Tamanho do cache SSD = tamanho dos metadados na memória para cache SSD (19 GB) / 0,08 (8 por cento)

Para D14 v2 e HDI 4.0, o tamanho recomendado do cache SSD = 19 GB / 0,08 ~= 237 GB

10. Ajustando a memória de junção do mapa

Configuração: hive.auto.convert.join.noconditionaltask.size

Verifique se hive.auto.convert.join.noconditionaltask está habilitado para que esse parâmetro entre em vigor. Essa configuração determina o limite para a seleção do MapJoin pelo otimizador do Hive que considera a sobreassinatura de memória de outros executores para ter mais espaço para tabelas de hash na memória para permitir mais conversões de junção de mapa. Considerando 3 GB por executor, esse tamanho pode ser sobrecarregado para 3 GB, mas alguma memória de pilha também pode ser usada para buffers de classificação, buffers aleatórios, etc. pelas outras operações.
Portanto, para D14 v2, com 3 GB de memória por executor, é recomendável definir esse valor para 2048 MB.

(Nota: Este valor pode necessitar de ajustes adequados à sua carga de trabalho. Definir esse valor muito baixo pode não usar o recurso de conversão automática. E defini-lo muito alto pode resultar em exceções de falta de memória ou pausas de GC que podem resultar em desempenho adverso.)

11. Número de daemons LLAP

Variáveis de ambiente Ambari: num_llap_nodes, num_llap_nodes_for_llap_daemons

num_llap_nodes - especifica o número de nós usados pelo serviço LLAP do Hive, isso inclui nós que executam o daemon LLAP, o LLAP Service Master e o Tez Application Master(Tez AM).

`Number of Nodes for LLAP service`.
num_llap_nodes_for_llap_daemons - número especificado de nós usados apenas para daemons LLAP. Os tamanhos de contêiner do daemon LLAP são definidos como nó de ajuste máximo, portanto, resulta em um llap daemon em cada nó.

`Number of Nodes for LLAP daemons`.

É recomendável manter ambos os valores iguais ao número de nós de trabalho no cluster de Consulta Interativa.

Considerações para o gerenciamento de carga de trabalho

Se você quiser habilitar o gerenciamento de carga de trabalho para LLAP, certifique-se de reservar capacidade suficiente para que o gerenciamento de carga de trabalho funcione conforme o esperado. O gerenciamento de carga de trabalho requer a configuração de uma fila YARN personalizada, que é além da llap fila. Certifique-se de dividir a capacidade total de recursos do cluster entre llap fila e fila de gerenciamento de carga de trabalho de acordo com seus requisitos de carga de trabalho. O gerenciamento de carga de trabalho gera Tez Application Masters (Tez AMs) quando um plano de recursos é ativado.

Nota:

  • As AMs Tez geradas pela ativação de um plano de recursos consomem recursos da fila de gerenciamento de carga de trabalho, conforme especificado pelo hive.server2.tez.interactive.queue.
  • O número de Tez AMs dependeria do valor especificado no plano de QUERY_PARALLELISM recursos.
  • Quando o gerenciamento de carga de trabalho estiver ativo, os Tez AMs na fila LLAP não serão usados. Somente Tez AMs da fila de gerenciamento de carga de trabalho são usados para coordenação de consultas. Tez AMs na fila são usados quando o llap gerenciamento de carga de trabalho está desativado.

Por exemplo: Capacidade total do cluster = 100 GB de memória, dividida entre LLAP, Gerenciamento de carga de trabalho e filas padrão da seguinte maneira:

  • Capacidade da fila LLAP = 70 GB
  • Capacidade da fila de gerenciamento de carga de trabalho = 20 GB
  • Capacidade da fila padrão = 10 GB

Com 20 GB de capacidade de fila de gerenciamento de carga de trabalho, um plano de recursos pode especificar QUERY_PARALLELISM o valor como cinco, o que significa que o gerenciamento de carga de trabalho pode iniciar cinco AMs Tez com tamanho de contêiner de 4 GB cada. Se QUERY_PARALLELISM for maior do que a capacidade, você pode ver alguns Tez AMs parar de responder no ACCEPTED estado. O servidor Hive 2 Interactive não pode enviar fragmentos de consulta para as AMs Tez que não estão no RUNNING estado.

Passos Seguintes

Se a definição destes valores não resolver o problema, visite um dos seguintes...