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.
Conéctese al nodo maestro del clúster de destino. Para obtener más información, consulte Connect to a cluster.
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:
|
|
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:
Conéctese a cualquier nodo del clúster de destino. Para obtener más información, consulte Connect to a cluster.
-
Opcional: Ejecute el siguiente comando para establecer el ancho de banda máximo del balanceador.
hdfs dfsadmin -setBalancerBandwidth <bandwidth in bytes per second>NotaEl 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 eshdfs 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. -
Ejecute el siguiente comando para cambiar al usuario
hdfsy 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 5NotaEl parámetro
-threshold 5establece 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.
-
-
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.logNotaLos nombres de archivo de registro
hadoop-hdfs-balancer-master-1-1.c-xxx.logyhadoop-hdfs-balancer-emr-header-xx.cluster-xxx.logson 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 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.
NotaEl 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
getBlocksal 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
getBlocksbloquea 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 * 4en 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 %.