O HDFS balancer analisa a distribuição de blocos e redistribui dados entre os DataNodes para manter uma utilização uniforme do armazenamento em todo o cluster.
Contexto
O HDFS utiliza uma arquitetura master-slave. O NameNode gerencia os metadados do sistema de arquivos, como nomes de arquivos e a localização dos blocos de dados, enquanto vários DataNodes armazenam os blocos de dados reais. Essa arquitetura permite redundância de dados e melhora a tolerância a falhas do sistema.
Com o tempo, operações como adição, exclusão e modificação de arquivos podem levar a uma distribuição desigual de dados entre os DataNodes. Alguns nós podem se aproximar da capacidade máxima de armazenamento, enquanto outros possuem bastante espaço livre. Esse desequilíbrio afeta a eficiência do armazenamento e aumenta o risco de perda de dados, pois nós sobrecarregados ficam mais vulneráveis a falhas de hardware.
Para resolver esse problema, o HDFS fornece o HDFS balancer, um utilitário de linha de comando que move blocos de dados entre os DataNodes para reduzir o desequilíbrio de armazenamento e melhorar a utilização de recursos.
Visualize capacidade e uso dos DataNodes
Verifique a capacidade e o uso dos DataNodes para identificar desequilíbrios de armazenamento e determinar se é necessário rebalancear.
Conecte-se ao nó mestre do cluster de destino. Para obter mais informações, consulte Connect to a cluster.
Execute o seguinte comando para visualizar a capacidade e o uso de cada DataNode.
hdfs dfsadmin -report
A saída exibe a capacidade total, o espaço utilizado, a porcentagem de uso e o espaço restante de cada DataNode.
Inicie o HDFS balancer quando as diferenças de uso de armazenamento entre os DataNodes ultrapassarem o limiar configurado (10% por padrão).
Iniciar o HDFS balancer
Método 1: Usar o comando hdfs balancer
A sintaxe do comando hdfs balancer é a seguinte:
hdfs balancer
[-threshold <threshold>]
[-policy <policy>]
[-exclude [-f <hosts-file> | <comma-separated list of hosts>]]
[-include [-f <hosts-file> | <comma-separated list of hosts>]]
[-source [-f <hosts-file> | <comma-separated list of hosts>]]
[-blockpools <comma-separated list of blockpool ids>]
[-idleiterations <idleiterations>]
A tabela a seguir descreve os principais parâmetros do balancer.
|
Parâmetro |
Descrição |
|
threshold |
Porcentagem permitida de desvio em relação ao uso médio de disco no cluster. O valor padrão é 10%, o que significa que o uso de qualquer DataNode deve estar dentro de 10% (para mais ou para menos) da média do cluster. Quando o uso geral do cluster estiver alto, reduza este valor para evitar que o balancer não consiga encontrar blocos móveis. Ao adicionar muitos novos nós ao cluster, aumente este valor para acelerar a movimentação de dados de nós com alto uso para nós com baixo uso. |
|
policy |
Política de balanceamento. As seguintes políticas são suportadas:
|
|
exclude |
Exclui os DataNodes especificados da operação de balanceamento. |
|
include |
Inclui apenas os DataNodes especificados na operação de balanceamento. |
|
source |
Especifica quais DataNodes podem atuar como fontes para a movimentação de dados. |
|
blockpools |
Executa o balancer apenas nos pools de blocos especificados. |
|
idleiterations |
Número máximo de iterações ociosas antes que o balancer seja encerrado. Este valor substitui o padrão de 5. |
Método 2: Usar a ferramenta start-balancer.sh
O script start-balancer.sh é um wrapper que chama o comando hdfs daemon start balancer. Para usar o script, siga estas etapas:
Conecte-se a qualquer nó do cluster de destino. Para obter mais informações, consulte Connect to a cluster.
-
Opcional: Execute o seguinte comando para definir a largura de banda máxima do balancer.
hdfs dfsadmin -setBalancerBandwidth <bandwidth in bytes per second>NotaO parâmetro
<bandwidth in bytes per second>especifica a largura de banda máxima. Por exemplo, para definir a largura de banda como 200 MB/s, o valor é 209.715.200 (200 1024 1024 bytes). O comando completo éhdfs dfsadmin -setBalancerBandwidth 209715200. Para otimizar o uso da rede e proteger serviços críticos durante períodos de alta carga, recomendamos reduzir a largura de banda de balanceamento, por exemplo, para 20.971.520 (20 MB/s). Durante horários de baixa demanda, aumente a largura de banda, por exemplo, para 1.073.741.824 (1 GB/s), para acelerar o processo de balanceamento. -
Execute o seguinte comando para alternar para o usuário
hdfse executar o script do balancer.-
Cluster DataLake
su hdfs /opt/apps/HDFS/hdfs-current/sbin/start-balancer.sh -threshold 5 -
Cluster Hadoop
su hdfs /usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 5NotaO parâmetro
-threshold 5define o limiar de balanceamento. Um limiar de 5% significa que o balancer considera um DataNode balanceado se seu uso de armazenamento estiver dentro de 5% do uso médio do cluster. O balancer não moverá blocos de dados para ou desse nó. Ajuste esse valor para atingir o equilíbrio desejado para o seu ambiente.
-
-
Execute o seguinte comando para monitorar o progresso do balancer.
-
Cluster DataLake
tail -f /var/log/emr/hadoop-hdfs/hadoop-hdfs-balancer-master-1-1.c-xxx.log -
Cluster Hadoop
tail -f /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-1.cluster-xxx.logNotaOs nomes de arquivo de log
hadoop-hdfs-balancer-master-1-1.c-xxx.logehadoop-hdfs-balancer-emr-header-xx.cluster-xxx.logsão exemplos. Use os nomes reais dos arquivos de log do seu cluster.
Se a saída contiver a palavra
Successfully, a operação foi bem-sucedida. -
Ajustar parâmetros do balancer
O balancer consome recursos do sistema, portanto, execute-o durante horários de baixa demanda. Por padrão, nenhum ajuste de parâmetro é necessário. Se for preciso ajustar, acesse a página do service HDFS no console E-MapReduce, selecione Configure > hdfs-site.xml e ajuste as seguintes configurações.
-
Configurações de cliente
Parâmetro
Descrição
dfs.balancer.dispatcherThreads
Antes de mover blocos de dados, o balancer recupera uma lista de blocos em cada iteração e os despacha para as threads de movimentação.
NotaO parâmetro dispatcherThreads define o número de threads para essa tarefa de despacho. O padrão é 200.
dfs.balancer.rpc.per.sec
Número de RPCs enviados por segundo. O padrão é 20.
As threads de despacho fazem numerosas chamadas RPC
getBlockspara o NameNode. Para evitar carga excessiva no NameNode, controle a taxa desses RPCs.Por exemplo, em um cluster com alta carga, reduza esse valor para 10 ou 5. Isso tem um impacto mínimo no progresso geral da movimentação de dados.
dfs.balancer.getBlocks.size
Em cada iteração, o balancer recupera uma lista de blocos para as threads de movimentação. Este parâmetro define o tamanho total dos blocos nessa lista, com um padrão de 2 GB. Como o processo
getBlocksbloqueia o NameNode, ajuste esse valor com base na carga atual do NameNode.dfs.balancer.moverThreads
Número de threads que movem blocos de dados. Cada thread lida com a movimentação de um bloco.
O valor padrão é 1000.
-
Configurações de DataNode
Parâmetro
Descrição
dfs.datanode.balance.bandwidthPerSec
Especifica a largura de banda que um DataNode pode usar para balanceamento. A configuração recomendada é 100 MB/s. Também é possível ajustar esse valor dinamicamente com o comando dfsadmin -setBalancerBandwidth sem reiniciar o DataNode.
Por exemplo, aumente a largura de banda durante períodos de baixa carga e diminua-a durante períodos de alta carga.
dfs.datanode.balance.max.concurrent.moves
Número máximo de blocos que um DataNode pode mover simultaneamente. O padrão é 5.
Normalmente, esse valor deve corresponder ao número de discos. Recomendamos definir um limite superior de
4 *no lado do DataNode e depois ajustá-lo usando o balancer.Por exemplo, se um DataNode tiver 28 discos, defina o valor como 28 no lado do balancer e como
28 * 4no lado do DataNode. Ajuste os valores com base na carga do cluster. Aumente o número de movimentações simultâneas quando a carga estiver baixa e diminua quando a carga estiver alta.
Perguntas frequentes
P: Por que a diferença de uso entre os nós ainda fica em torno de 20% após o balanceamento, mesmo com o limiar definido em 10%?
R: O parâmetro threshold garante que o uso de cada DataNode não se desvie do uso médio do cluster em mais do que a porcentagem especificada. Portanto, após o balanceamento, a diferença de uso entre os nós mais e menos utilizados pode ser de até duas vezes o limiar. Por exemplo, um nó pode estar 10% acima da média, enquanto outro está 10% abaixo, resultando em uma diferença de 20% entre eles. Para reduzir essa diferença, tente definir o threshold com um valor menor, como 5%.