Todos los productos
Search
Centro de documentos

E-MapReduce:Balanceador de HDFS

Última actualización: Sep 04, 2026

El balanceador de HDFS analiza la distribución de bloques y redistribuye los datos entre los DataNodes para mantener una utilización uniforme del almacenamiento en todo el clúster.

Contexto

HDFS utiliza una arquitectura maestro-esclavo. El NameNode gestiona los metadatos del sistema de archivos, como los nombres de archivo y la ubicación de los bloques de datos, mientras que varios DataNodes almacenan los bloques de datos reales. Esta arquitectura permite la redundancia de datos y mejora la tolerancia a fallos del sistema.

Con el tiempo, operaciones como agregar, eliminar y modificar archivos pueden provocar una distribución desigual de los datos en los DataNodes. Algunos nodos pueden acercarse a su capacidad de almacenamiento, mientras que otros disponen de amplio espacio libre. Este desequilibrio afecta la eficiencia del almacenamiento y aumenta el riesgo de pérdida de datos, ya que los nodos con mayor utilización son más vulnerables a fallos de hardware.

Para resolver este problema, HDFS proporciona el balanceador de HDFS, una utilidad de línea de comandos que mueve bloques de datos entre los DataNodes para reducir el desequilibrio de almacenamiento y mejorar la utilización de recursos.

Consulte la capacidad y el uso de los DataNodes

Revise la capacidad y el uso de los DataNodes para identificar desequilibrios de almacenamiento y determinar si es necesario realizar un rebalanceo.

  1. Conéctese al nodo maestro del clúster de destino. Para obtener más información, consulte Connect to a cluster.

  2. Ejecute el siguiente comando para consultar la capacidad y el uso de cada DataNode.

hdfs dfsadmin -report

La salida muestra la capacidad total, el espacio utilizado, el porcentaje de uso y el espacio restante de cada DataNode.

Inicie el balanceador de HDFS cuando las diferencias de uso de almacenamiento entre los DataNodes superen el umbral configurado (10 % de forma predeterminada).

Iniciar el balanceador de HDFS

Método 1: Uso del comando hdfs balancer

La sintaxis del comando hdfs balancer es la siguiente:

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 continuación se describen los parámetros principales del balanceador.

Parámetro

Descripción

threshold

Porcentaje de desviación permitido respecto al uso promedio de disco en el clúster.

El valor predeterminado es 10 %, lo que significa que el uso de cualquier DataNode debe estar dentro de un margen de ±10 % respecto al promedio del clúster.

Cuando el uso general del clúster es alto, reduzca este valor para evitar que el balanceador no encuentre bloques movibles.

Si agrega muchos nodos nuevos al clúster, aumente este valor para acelerar el movimiento de datos desde los nodos con mayor uso hacia los de menor uso.

policy

Directiva de balanceo. Se admiten las siguientes directivas:

  • datanode (predeterminado): El clúster se considera balanceado cuando el uso de cada DataNode está dentro del umbral.

  • blockpool: El clúster se considera balanceado cuando el pool de bloques de cada DataNode cumple con los criterios de balanceo.

exclude

Excluye los DataNodes especificados de la operación de balanceo.

include

Incluye únicamente los DataNodes especificados en la operación de balanceo.

source

Especifica qué DataNodes pueden actuar como origen para el movimiento de datos.

blockpools

Ejecuta el balanceador solo en los pools de bloques especificados.

idleiterations

Número máximo de iteraciones inactivas antes de que el balanceador finalice. Este valor anula el valor predeterminado de 5.

Método 2: Uso de la herramienta start-balancer.sh

El script start-balancer.sh es un contenedor que invoca el comando hdfs daemon start balancer. Para utilizar el script, siga estos pasos:

  1. Conéctese a cualquier nodo del clúster de destino. Para obtener más información, consulte Connect to a cluster.

  2. Opcional: Ejecute el siguiente comando para establecer el ancho de banda máximo del balanceador.

    hdfs dfsadmin -setBalancerBandwidth <bandwidth in bytes per second>
    Nota

    El parámetro <bandwidth in bytes per second> especifica el ancho de banda máximo. Por ejemplo, para establecer el ancho de banda en 200 MB/s, el valor es 209,715,200 (200 1024 1024 bytes). El comando completo es hdfs dfsadmin -setBalancerBandwidth 209715200. Para optimizar el uso de la red y proteger los servicios críticos durante periodos de alta carga, se recomienda reducir el ancho de banda de balanceo, por ejemplo a 20,971,520 (20 MB/s). Durante las horas de baja demanda, puede aumentar el ancho de banda, por ejemplo a 1,073,741,824 (1 GB/s), para acelerar el proceso de balanceo.

  3. Ejecute el siguiente comando para cambiar al usuario hdfs y ejecutar el script del balanceador.

    • Clúster DataLake

      su hdfs
      /opt/apps/HDFS/hdfs-current/sbin/start-balancer.sh -threshold 5
    • Clúster Hadoop

      su hdfs
      /usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 5
      Nota

      El parámetro -threshold 5 establece el umbral de balanceo. Un umbral del 5 % significa que el balanceador considera que un DataNode está equilibrado si su uso de almacenamiento se encuentra dentro de un margen del 5 % respecto al uso promedio del clúster. En ese caso, el balanceador no moverá bloques de datos hacia o desde dicho nodo. Puede ajustar este valor para lograr el equilibrio deseado en su entorno.

  4. Ejecute el siguiente comando para supervisar el progreso del balanceador.

    • Clúster DataLake

      tail -f /var/log/emr/hadoop-hdfs/hadoop-hdfs-balancer-master-1-1.c-xxx.log
    • Clúster Hadoop

      tail -f /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-1.cluster-xxx.log
      Nota

      Los nombres de archivo de registro hadoop-hdfs-balancer-master-1-1.c-xxx.log y hadoop-hdfs-balancer-emr-header-xx.cluster-xxx.log son ejemplos. Utilice los nombres de archivo de registro reales de su clúster.

    Si la salida contiene la palabra Successfully, la operación se completó correctamente.

Ajustar los parámetros del balanceador

El balanceador consume recursos del sistema, por lo que se recomienda ejecutarlo durante las horas de baja demanda. De forma predeterminada, no es necesario ajustar ningún parámetro. Si requiere ajustes, vaya a la página del servicio HDFS en la consola de E-MapReduce, seleccione Configure > hdfs-site.xml y modifique las siguientes configuraciones.

  • Configuraciones del cliente

    Parámetro

    Descripción

    dfs.balancer.dispatcherThreads

    Antes de mover bloques de datos, el balanceador obtiene una lista de bloques en cada iteración y los asigna a los hilos de movimiento.

    Nota

    El parámetro dispatcherThreads define el número de hilos para esta tarea de asignación. El valor predeterminado es 200.

    dfs.balancer.rpc.per.sec

    Número de RPC enviados por segundo. El valor predeterminado es 20.

    Los hilos de asignación realizan numerosas llamadas RPC getBlocks al NameNode. Para evitar una carga excesiva en el NameNode, puede controlar la tasa de estas RPC.

    Por ejemplo, en un clúster con alta carga, puede reducir este valor a 10 o 5. Esto tiene un impacto mínimo en el progreso general del movimiento de datos.

    dfs.balancer.getBlocks.size

    En cada iteración, el balanceador obtiene una lista de bloques para los hilos de movimiento. Este parámetro establece el tamaño total de los bloques en dicha lista, con un valor predeterminado de 2 GB. Dado que el proceso getBlocks bloquea el NameNode, puede ajustar este valor según la carga actual del NameNode.

    dfs.balancer.moverThreads

    Número de hilos que mueven bloques de datos. Cada hilo gestiona el movimiento de un bloque.

    El valor predeterminado es 1000.

  • Configuraciones de DataNode

    Parámetro

    Descripción

    dfs.datanode.balance.bandwidthPerSec

    Especifica el ancho de banda que un DataNode puede utilizar para el balanceo. La configuración recomendada es 100 MB/s. También puede ajustar este valor dinámicamente con el comando dfsadmin -setBalancerBandwidth sin necesidad de reiniciar el DataNode.

    Por ejemplo, aumente el ancho de banda durante los periodos de baja carga y redúzcalo durante los periodos de alta carga.

    dfs.datanode.balance.max.concurrent.moves

    Número máximo de bloques que un DataNode puede mover simultáneamente. El valor predeterminado es 5.

    Por lo general, este valor debe corresponder al número de discos. Se recomienda establecer un límite superior de 4 * en el lado del DataNode y luego ajustarlo mediante el balanceador.

    Por ejemplo, si un DataNode tiene 28 discos, puede establecer el valor en 28 en el lado del balanceador y en 28 * 4 en el lado del DataNode. Ajuste los valores según la carga del clúster. Aumente el número de movimientos simultáneos cuando la carga sea baja y redúzcalo cuando la carga sea alta.

Preguntas frecuentes

P: ¿Por qué la diferencia de uso entre nodos sigue siendo de alrededor del 20 % después del balanceo, incluso cuando el umbral está establecido en 10 %?

R: El parámetro threshold garantiza que el uso de cada DataNode no se desvíe del uso promedio del clúster en más del porcentaje especificado. Por lo tanto, después del balanceo, la brecha de uso entre los nodos más y menos utilizados puede ser de hasta el doble del umbral. Por ejemplo, un nodo podría estar un 10 % por encima del promedio, mientras que otro está un 10 % por debajo, lo que resulta en una brecha del 20 % entre ellos. Para reducir esta brecha, intente establecer el parámetro threshold en un valor menor, como 5 %.