Docker
내가 원하는 환경의 서버를 container라는 개념으로 쉽게 생성 및 삭제할 수 있는 플랫폼.
관련 글
[Docker] Docker로 Hadoop 구성하기 #1 - MacOS에 Docker 설치 및 CentOS 실행
[Docker] Docker로 Hadoop 구성하기 #2 - Hadoop 설치 및 세팅
이전 글에서 docker의 CentOS container에서 hadoop 설치 및 세팅까지 완료했습니다. 이제는 hadoop 세팅까지 완료된 이미지를 기반으로 다수의 container를 실행해 클러스터를 구성해보겠습니다. 그리고 간단한 wordcount 예제까지 해보겠습니다.
Hadoop 클러스터 구성
hadoop 클러스터는 NameNode 1개, DataNode 3개로 구성하겠습니다. 이전 글에서 만든 centos:hadoop을 이용하겠습니다. 각각의 노드를 위한 container 생성은 새로운 Local PC 터미널에서 실행합니다.
/* NameNode container */
$ docker run -it -h nn --name nn -p 50070:50070 centos:hadoop
여기서 -p 50070:50070은 port forwarding으로 Local PC의 localhost port와 docker container의 port를 연결시켜줍니다. 즉 사용자가 localhost의 50070 port를 요청하면 docker container의 50070 port의 서비스를 보여줍니다.
이어서 DataNode container 3개를 각각 실행합니다.
/* DataNode1 */
$ docker run -it -h dn1 --name dn1 --link nn:nn centos:hadoop
/* DataNode2 */
$ docker run -it -h dn2 --name dn2 --link nn:nn centos:hadoop
/* DataNode3 */
$ docker run -it -h dn3 --name dn3 --link nn:nn centos:hadoop
--link 옵션은 생성할 container와 특정 container를 연결시켜줍니다. ( container 이름 : 별칭 )
hadoop 구성을 위해선 NameNode 가 DataNode 의 ip를 알아야 합니다. docker inspect 명령어를 통해 확인할 수 있습니다.
$ docker inspect nn | grep IPAddress
$ docker inspect dn1 | grep IPAddress
$ docker inspect dn2 | grep IPAddress
$ docker inspect dn3 | grep IPAddress
이제 DataNode 들의 ip들을 모두 알았으니 NameNode 에서 hosts 정보를 입력해야 합니다. NameNode 터미널에서 vim을 이용하여 hosts 파일을 아래 그림처럼 수정해줍니다.
/* NameNode Terminal */
$ vim /etc/hosts
이 때 참고할 점으로는 container를 stop 시키고 재실행했을 때 hosts 파일은 초기화됩니다. 그래서 매번 conatiner를 다시 시작할 때마다 hosts 파일을 작성해줘야 하는데 이러한 불편한 점을 해결하기 위해 shell script를 만들어놓기도 합니다. ( Docker를 공부하시다 보면 hosts 파일의 필요성이 없다는 것을 아시게 될 겁니다. )
다음으로는 hadoop 구성에 있어 slave 노드들, 즉 DataNode 들의 hostname을 적어줘야합니다. 아래와 같이 slaves 파일을 수정해줍니다.
/* NameNode Terminal */
$ cd $HADOOP_CONFIG_HOME
$ vim slaves
이제 hadoop 구성 및 설정을 모두 완료했으니 각 노드에서 필요한 프로세스를 구동시키기 위해 start-all.sh 스크립트를 이용합니다. 제가 작성한 순서대로 따라오셨더라면 각 노드가 이미 RUNNING 상태일 것입니다. 혹시라도 노드 중 하나라도 stop 되어 있는 상태라면 start를 시켜주시기 바랍니다.
$ start-all.sh
스크립트를 실행 후 'ps -ef' 명령어를 터미널에 입력하면 Java process가 실행 중인 실행 중인 것을 확인할 수 있습니다. 하지만 Java process의 상세한 이름은 나오지 않으므로 'jps' 명령어를 입력해줍니다. 'jps' 명령어의 결과로 아래 그림처럼 nn container에서 NameNode , ResourceManager, SecondaryNameNode process가 실행 중인 것을 확인할 수 있습니다. dn container도 마찬가지로 실행 중인 process를 확인할 수 있습니다.
Hadoop 구동까지 모두 완료했습니다. 이제부터는 hadoop 명령어를 사용할 수 있습니다. hadoop 명령어는 linux 명령어와 상당히 비슷하기 때문에 일반 linux 서버처럼 다룰 수 있습니다.
마지막으로 아까 nn container를 실행시킬 때 port forwarding 했던 port에 직접 접근해보겠습니다. 현재 작업 중인 Local PC에서 localhost:50070을 입력하시면 됩니다.
접속하면 위에서 말했듯이 해당 서비스는 docker nn container의 50070 port 서비스입니다. 50070 port는 hadoop 정보를 web ui 서비스로 제공합니다. 그래서 해당 페이지에서 NameNode 및 DataNode 의 상태들을 알 수 있고 hdfs directory 또한 ui로 볼 수 있습니다.
References
https://soft.plusblog.co.kr/136
'BigData Engineering > Docker' 카테고리의 다른 글
[Docker] Docker로 Hadoop 구성하기 #2 - Hadoop 설치 및 세팅 (14) | 2021.05.31 |
---|---|
[Docker] Docker로 Hadoop 구성하기 #1 - MacOS에 Docker 설치 및 CentOS 실행 (0) | 2021.05.21 |