Hadoop

HDFS - Balance

개발 일기92 2025. 1. 26. 14:36

 

HDFS를 운영하면서 데이터 불균형이 발생하여 밸런싱을 실행해야 하는 경우가 있다. 

주의할 점은 밸런서는 랙 인식(Rack Awareness) 설정이 되어 있지 않으면 동작하지 않는다.

 

  • 데이터 불균형이 발생하는 경우
    • 데이터 노드를 추가하는 경우

하둡의 데이터 저장 공간이 부족하여 데이터노드를 추가하는 경우 다른 노드의 사용공간은 70~80% 정도인데 신규 데이터 노드는 사용공간이 0%

 

    • 대량의 데이터를 삭제하는 경우 

특정 데이터 노드에 블록이 많이 저장되어 데이터노드간 저장공간 차이가 20~30% 정도 발생하는 경우

 

    • 대량의 데이터를 추가하는 경우

특정 데이터 노드에 데이터가 적은 경우 네임노드는 데이터 저장공간이 작은 노드를 우선적으로 사용하는데 이 경우 특정 노드로 I/O가 집중 되게 됨

 

  • HDFS Balancer

밸런서는 다음과 같이 실행합니다. 상황에 따라 작업 시간이 굉장히 오래걸릴 수도 있다.

$ hdfs balancer -threshold 5
Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved  NameNode
Nov 7, 2022 6:50:16 AM            0              4.23 GB            14.96 GB              10 GB  hdfs://hdfs-namenode:8020
Nov 7, 2022 7:06:49 AM            1              9.96 GB             9.63 GB              10 GB  hdfs://hdfs-namenode:8020
Nov 7, 2022 7:22:56 AM            2             15.53 GB             4.23 GB            8.77 GB  hdfs://hdfs-namenode:8020
The cluster is balanced. Exiting...
Nov 7, 2022 7:23:05 AM            3             15.53 GB                 0 B                0 B  hdfs://hdfs-namenode:8020
Nov 7, 2022 7:23:05 AM   Balancing took 44.9548 minutes

 

  • 대역폭

밸런서는 작업간 많은 데이터 이동이 발생하기 때문에 대역폭을 지정하여 다른 작업에 영향이 가지 않도록 하는 것이 좋습니다.

hdfs dfsadmin -setBalancerBandwidth 1073741824

 

  • threshold

각 노드간 데이터 사용비율 차이를 임계값을 이용하여 지정합니다.

hdfs balancer -threshold 3

 

 

  • 추가 설정: hdfs-site.xml
    • dfs.datanode.balance.max.concurrent.moves: 50

데이터노드가 데이터 이동에 사용할 스레드 개수

 

 

    • dfs.datanode.balance.bandwidthPerSec: 10MB

데이터 이동에 사용하는 대역폭