Docker
내가 원하는 환경의 서버를 container라는 개념으로 쉽게 생성 및 삭제할 수 있는 플랫폼.
CDH ( Cloudera’s Distribution including Apache Hadoop )
Cloudera에서 hadoop eco system의 다양한 component들을 묶은 플랫폼 배포판
관련 글
[Docker] Docker로 CDH 배포판 설치하기 #1 - 기본 세팅 및 Cloudera Manager Installer 다운 받기
[Docker] Docker로 CDH 배포판 설치하기 #2 - Cloudera Manager로 클러스터 구성하기
이전 글에서 docker 로 클러스터를 구성 및 설치 작업을 진행했었습니다. 그렇다면 이렇게 많은 설치 작업을 진행한 지금 현재의 클러스터 상태를 이미지화시킬 수 없을까요? 이번 글에서 NameNode와 DataNode를 이미지화시키고 클러스터를 재생성시키는 작업을 진행하도록 하겠습니다.
모든 노드 이미지 만들기
지금 현재 클러스터 구성이 되고 있는 노드는 hadoop01, hadoop02, hadoop03, hadoop04로 NameNode 1개, DataNode 3개입니다. 그럼 모든 노드를 각각 이미지 생성하겠습니다. 이미지 생성 전 모든 컨테이너들을 종료시키거나 stop 시켜주세요. 참고로 이미지 생성하는데 시간이 조금 걸립니다.
/* Local PC */
$ docker commit hadoop01 cdh_nn1
$ docker commit hadoop02 cdh_dn1
$ docker commit hadoop03 cdh_dn2
$ docker commit hadoop04 cdh_dn3
위의 명령어대로 이미지를 생성했다면 아래와 같이 나타납니다. 여러 가지 패키지들과 프로그램들을 설치하다 보니 용량이 상당히 크게 잡혔습니다. 4개 이미지의 총합 용량이 약 100기가인데 이 용량을 줄일 수 있는 방법으로써는 뒤에서 다시 설명하겠습니다.
노드 이미지로 클러스터 생성
이제부터는 위에서 만든 이미지로 클러스터 생성을 진행하겠습니다. 작업은 간단합니다. 위에서 만든 이미지당 container 1개씩 각각 docker run을 진행해주면 됩니다.
/* hadoop01 - NN1 */
$ docker run --privileged --name hadoop01 -p 7180:7180 -itd -h hadoop01.hadoop.com -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup:ro cdh_nn1 /usr/sbin/init
/* hadoop02 - DN1 */
$ docker run --privileged --name hadoop02 --link hadoop01:hadoop01 -itd -h hadoop02.hadoop.com -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup:ro cdh_dn1 /usr/sbin/init
/* hadoop03 - DN2 */
$ docker run --privileged --name hadoop03 --link hadoop01:hadoop01 -itd -h hadoop03.hadoop.com -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup:ro cdh_dn2 /usr/sbin/init
/* hadoop04 - DN3 */
$ docker run --privileged --name hadoop04 --link hadoop01:hadoop01 -itd -h hadoop04.hadoop.com -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup:ro cdh_dn3 /usr/sbin/init
4개 container가 모두 실행되었다면 7180 port(localhost:7180)를 통해 Cloudera Manager server에 접속해봅니다. 이때 Cloudera Manager server 웹페이지가 올라오는데 몇분의 시간이 걸릴 수 있는 점 참고바랍니다. 아마 정상적으로 실행이 되던 클러스터의 모든 노드를 그대로 이미지화 시켰고 다시 container로 생성했기 때문에 문제 없이 클러스터 구성이 되어있을 겁니다.
( Cloudera Manager server 페이지에 접속했을 때 클러스터 설치 UI가 나타난다면 좌측 상단 홈 버튼을 누르면 됩니다. )
NameNode, DataNode 이미지만으로 클러스터 생성
위에서 보았듯이 4개 노드의 경우 이미지를 만들었을 때 총 100GB라는 거대한 용량을 가지게 됩니다. 하지만 이 때 DataNode의 경우에는 이미지 1개만 만들어놓고 이 이미지를 가지고 모든 container를 생성하면 되지 않을까? 라는 생각을 하게 됩니다. 만약 이 가정이 성립된다면 우리는 50GB의 용량만으로 클러스터를 다시 생성할 수 있게 됩니다. 심지어 DateNode의 수가 많으면 많을수록 더욱 효율적인 container 생성을 할 수 있습니다.
기존의 container들은 모두 삭제하고 새롭게 만들겠습니다. 명령어는 이전과 모두 동일하지만 hadoop03, hadoop04 container의 경우 dn1 이미지로 생성합니다.
/* hadoop01 - NN1 */
$ docker run --privileged --name hadoop01 -p 7180:7180 -itd -h hadoop01.hadoop.com -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup:ro cdh_nn1 /usr/sbin/init
/* hadoop02 - DN1 */
$ docker run --privileged --name hadoop02 --link hadoop01:hadoop01 -itd -h hadoop02.hadoop.com -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup:ro cdh_dn1 /usr/sbin/init
/* hadoop03 - DN2 */
$ docker run --privileged --name hadoop03 --link hadoop01:hadoop01 -itd -h hadoop03.hadoop.com -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup:ro cdh_dn1 /usr/sbin/init
/* hadoop04 - DN3 */
$ docker run --privileged --name hadoop04 --link hadoop01:hadoop01 -itd -h hadoop04.hadoop.com -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup:ro cdh_dn1 /usr/sbin/init
container들이 모두 생성되고 Cloudera Manager server 페이지를 확인합니다. 클러스터의 모든 호스트를 보았을 때 아쉽게도 hadoop03, hadoop04의 heartbeat는 서버와 통신이 되지 않고 있습니다. 이미지는 동일하게 하고 host 이름만 바꿨다고 서버가 인식할 수 없다는 걸 알게 되었습니다. 그렇다면 여기서 생각해볼 수 있는 건 Cloudera Manager agent의 설정 값이 각 이미지마다 다르다는 것입니다.
중간에 여러 가지 시행착오가 있었지만 결과적으로 agent마다 고유한 ID 값이 있다는 것을 알게 되었습니다. agent 서버에 접속해 특정 경로에 접근하면 "uuid"라는 값을 볼 수 있습니다. 이 값이 agent마다 가지고 있는 고유한 ID입니다. 그리고 이 값은 Cloudera Manager server 페이지에서도 확인할 수 있었습니다. 아래 그림에서 "호스트 ID" 값이 현재 server가 클러스터를 설치하면서 등록해놓은 고유한 ID입니다.
- Directory : /var/lib/cloudera-agent/
- File : uuid
그렇다면 우리는 각 agent가 가지고 있는 uuid 값을 복사해 바꿔주면 문제를 해결할 수 있습니다. 간편하게 아래 명령어를 사용해 uuid 값을 바꿔주고 Cloudera Manager agent 서비스를 restart 해주면 됩니다. service 명령어를 사용할 수 없다면 "yum install -y initscripts"를 통해 설치가 완료된 후 실행하시기 바랍니다.
/* hadoop03 Terminal */
$ echo -n 5c691675-491c-4d08-9ba3-76455fe95c49 > /var/lib/cloudera-scm-agent/uuid
$ service cloudera-scm-agent restart
/* hadoop04 Terminal */
$ echo -n b144314d-7ff1-4e5e-9e61-e97d84a76de3 > /var/lib/cloudera-scm-agent/uuid
$ service cloudera-scm-agent restart
uuid 변경 및 service restart를 진행했다면 아래와 같이 모든 agent로부터 server와 heartbeat를 주고받는 것을 확인할 수 있습니다.
이를 통해 Cloudera Manager server는 agent로부터 heartbeat를 받지만, uuid를 통해 agent를 판단한다는 것을 알 수 있었습니다.
'BigData Engineering > CDH' 카테고리의 다른 글
[Docker] Docker로 CDH 배포판 설치하기 #2 - Cloudera Manager로 클러스터 구성하기 (2) | 2021.07.10 |
---|---|
[Docker] Docker로 CDH 배포판 설치하기 #1 - 기본 세팅 및 Cloudera Manager Installer 다운 받기 (1) | 2021.07.05 |