2019년 11월 26일 화요일

하둡 데이터노드 추가/리밸런싱 하기 (Adding and Rebalancing Hadoop Datanodes)

하둡에 데이터 노드를 추가하는 경우는 공간이 모자라거나 성능향상이 필요할 때이다. 공간이 부족할 경우 어쩔 수 없이 노드를 추가해야하지만(아니면 과거 데이터를 지우거나) 그 외에 성능 확장(병렬처리)을 위해서라면 10%의 성능 향상을 위해 기존 노드 갯수의 10%만큼은 추가해주어야 한다고 알려져있다.



하둡에 신규 노드를 추가하고 리밸런싱을 통해 재분산 작업을 해보도록 하자.

작업순서는 크게 다음과 같다.

1. 신규 데이터 노드들에 자바, 하둡 설치
2. ssh 통신을 위한 인증키복사
3. 마스터 노드에서 slave를 인식할 수 있도록 slaves 파일에 slave host 추가
(하둡 버전에 따라서 masters, slaves 혹은 workers로 존재할 수 있다.)
4. 마스터 노드에서 BalancerBandwidth 변경
5. 마스터 노드에서 데이터 노드 rebalance 수행
0. 예상치 못한 상황이 생길 경우 먼저 처리.


각 노드에 기존 노드들과 동일한 자바를(zulu jdk) 설치하자.
기존에 갖고 있던 자바 설치파일을 scp로 옮긴다.
scp ./zulu8.38.0.13-ca-jdk8.0.212-linux_x64.tar.gz id@a.b.c.214:test/sw/java
scp ./zulu8.38.0.13-ca-jdk8.0.212-linux_x64.tar.gz id@a.b.c.215:test/sw/java
scp ./zulu8.38.0.13-ca-jdk8.0.212-linux_x64.tar.gz id@a.b.c.216:test/sw/java
...


압축을 푼다.
tar -zxvf zulu8.38.0.13-ca-jdk8.0.212-linux_x64.tar.gz
tar -zxvf zulu8.38.0.13-ca-jdk8.0.212-linux_x64.tar.gz
tar -zxvf zulu8.38.0.13-ca-jdk8.0.212-linux_x64.tar.gz
...

기존노드들 처럼 심볼릭 링크 jdk를 만든다.
ln -s /sw/java/zulu8.38.0.13-ca-jdk8.0.212-linux_x64 jdk

JAVA_HOME path 변경해준다.
~/.bashrc에 JAVA_HOME과 HADOOP_HOME(미리 세팅)해 놓는다.
그리고 각각 환경에 맞게 필요한 것이 있다면 적용하도록 한다.





source .bashrc로 적용해서 echo $JAVA_HOME이 zulu가 잡히면 성공이다.

자바 세팅이 끝났다. 똑같은 방법으로 하둡을 설치한다.



하둡 설치 및 세팅
각 신규 노드는 별도로 4개의 디스크를 더 마운트하여 총 test01~5까지 있다.
먼저 /test01/hadoop 디렉토리 생성하고 test02~5까지 계층구조로 디렉토리 생성한다.
mkdir /test01/hadoop
mkdir -p /test02/hadoop/hdfs/data/
mkdir -p /test03/hadoop/hdfs/data/
mkdir -p /test04/hadoop/hdfs/data/
mkdir -p /test05/hadoop/hdfs/data/



역시나 마찬가지로 기존에 쓰던 하둡을 압축해서 신규노드들로 옮겨서 설치한다.
(위에서 ~/.bashrc에서 하둡경로 세팅해놓은 곳으로 설치한다고 보면 된다.)


scp ./hadoop-2.7.1.tar.gz id@10.203.5.214:/data01/hadoop
scp ./hadoop-2.7.1.tar.gz moneymall@10.203.5.215:/data01/hadoop
scp ./hadoop-2.7.1.tar.gz moneymall@10.203.5.216:/data01/hadoop
...

압축을 푼다.
각 노드에서 tar -zxvf hadoop-2.7.1.tar.gz 

cd $HADOOP_HOME으로 가서 경로가 잘 잡혔는지 확인한다.
hdfs dfs -ls / 명령어로 설치가 잘 되었는지 확인한다.

hdfs 명령어로 하둡 깔린거 확인했고 홈 잡혀있는거 확인했고 잘된것 같다.




다음은 ssh 통신을 위한 인증키를 복사하도록 하자.
~/.ssh 만들기
cd ~
mkdir .ssh
chmod 700 .ssh
cd .ssh

기존에 뚫어놓은 키 가져오기
아무데서나 가져와도 된다. 어차피 최초 설치 시 마스터가 뿌린것이기 때문이다.
scp authorized_keys id@a.b.c.201:/~~path~~/.ssh

다음처럼 키 내용이 제대로 들어있는지 확인하고 제대로 들어있으면 정상이다.

귀찮아도 ssh로 신규 데이터노드에 한번씩 꼭 붙어보자. (비번을 물어보지 않을 때까지..)

다음은 마스터 노드의 slaves 파일에 신규노드 추가 명시하자. 현재 하둡 2.7버전이고 여기에는 masters, slaves 파일이 존재했다. slaves파일에 신규 호스트들을 추가한다.


작업이 거의 끝나간다.

마스터에서 datanode refresh를 해준다.

hdfs dfsadmin -refreshNodes


기존 slave 72대에 일단 테스트로 5대만 추가해서 리프레쉬한 결과 5대의 데드노드가 추가됨을 확인

실제로 리프레시 후 Dead Nodes에 추가되었는지 확인한다.


yarn에서 보면 바로 적용은 안되고 조금 있어야 바뀌는 것 같다.

이제 추가된 데이터노드를 하나씩 살린다.

cd $HADOOP_HOME
sbin/hadoop-daemon.sh start datanode
sbin/yarn-daemon.sh start nodemanager


전후 jps를 통해 문제 없이 잘 살아남을 확인했다.

마지막으로 기존 데이터를 분산시켜주기 위해 리밸런싱을 하도록 하자.
(며칠이 걸릴지 모른다.)

마스터노드에서 대역폭을 100메가로 변경한다.
hdfs dfsadmin -setBalancerBandwidth 104857600


리밸런싱 시작한다. 숫자 5는 각 노드간 차이가 5%이내로 함을 의미한다.
sbin/start-balancer.sh -threshold 5




실행하니까 신규 노드에 데이터가 차는것을 확인할 수 있다.



리밸런싱 로그를 tail 걸어서 확인해보면 잘 진행되고 있다. 언제 끝날려나..


추후 확인해보니.. 기존 노드의 용량이 4TB씩이고 최대 3TB씩 사용하고있었다. 이를 5%씩 bandwidth 10mb로 분산시킨 결과 대략 2TB씩 골고루 나뉘어졌으며 이런 케이스에서는 약 15일 정도 소요되었다.

댓글 없음:

댓글 쓰기

2022년 회고

 올해는 블로그 포스팅을 열심히 못했다. 개인적으로 지금까지 경험했던 내용들을 리마인드하자는 마인드로 한해를 보낸 것 같다.  대부분의 시간을 MLOps pipeline 구축하고 대부분을 최적화 하는데 시간을 많이 할애했다. 결국에는 MLops도 데이...