[Hadoop] Window10(home)에서 Docker로 Hadoop Cluster 구성하기

[Hadoop] Window10(home)에서 Docker로 Hadoop Cluster 구성하기

728x90

0. 구축 환경 및 SW 버전

window10 home 20H2

WSL2

ubuntu 18.04

docker 20.10.8

hadoop 2.10.1

1. window10에 WSL2 설치하기

WSL2는 윈도우에서 리눅스를 사용할 수 있게 해준다.

이때 윈도우 home인 경우 버전이 20H1이상이어야 한다.

확인은 시작 -> 'PC 정보' 검색 -> Windows 사양의 버전 확인

* DISM으로 WSL 관련 기능 활성화 시킨다.

시작 -> power shell 관리자권한으로 실행 -> 명령어 입력

$ dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

DISM 명령어로 VirtualMachinePlatform 기능을 활성화합니다.

$ dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

* WSL2 Linux커널 업데이트

$ wsl --install

* 마이크로소프트 스토어에서 리눅스 설치

시작 -> 'Microsoft Store' 검색 -> 검색창에 'ubuntu' 검색 -> 맨 앞에 ubuntu 다운 및 설치

* 제어판에서 WSL 활성화시키기

제어판 -> 프로그램및기능 -> windows 기능켜기/끄기 -> [Linux용 Windows 하위시스템]체크 -> 확인

시작 -> '개발자 설정' -> 개발자 모드 "느슨한 파일을 ~" 켬

재부팅 후 윈도우 업데이트하기

시작 메뉴에서 ubuntu 실행

"Installing, this may take a few minutes...

Press any key to continue..."

뜨고 조금 기다리면 아이디, 비번 입력받는 창이 뜬다. (master/master)

다시 윈도우 터미널을 실행한다.

윈도우에 설치된 리눅스 버전을 확인해본다.

$ wsl -l -v

여기서 ubuntu 가 Running중인데 버전이 1이면 아래와 명령어를 실행한다.

WSL2 Linux 커널 업데이트를 진행한다.

먼저 아래 wsl_update_x64.msi를 다운받는다.

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

윈도우 터미널을 열고, 다음 명령어를 실행해, 기본적으로 사용할 WSL 버전을 2로 변경해줍니다.

$ wsl --set-default-version 2

"변환이 완료되었습니다."라는 출력 결과를 꼭 확인한다.

$ wsl -l -v

이때 Ubuntu 상태가 Stopped이면 시작에서 Ubuntu프로그램을 다시 실행한다.

마이크로소프트 스토어에서 "window terminal"을 설치하고 관리자 권한으로 실행한다.

power shell 탭에서 다음 두 명령어를 실행한다.

$ dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart $ dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

그리고 윈도우를 재부팅한다.

2. Docker 설치하기

아래 링크에서 도커 설치파일 다운로드받고 실행한다.

https://www.docker.com/products/docker-desktop

Configuration 창에서 두 개다 체크하고 Ok누른다.

다 다운되면 close and log out한다.

도커를 실행한다.

시스템에 WSL2가 활성화되어있다면 docker는 기본적으로 WSL2를 백엔드로 도커엔진을

사용한다.

이제 도커엔진에서 설정-> General -> Use the WSL2 based engine에 체크되어있는지 확인

Resources -> WSL Integration -> Enable Integration with my default WSL distro ->

Ubuntu 켜기

이제 윈도우터미널 프로그램에서 아래 명령어로 도커 전용 머신 실행중인 것 확인한다.

$ wsl -l -v

실행중인 컨테이너를 확인해본다.

$ docker ps

아직 아무것도 없다.

* 도커 테스트하기

#실행 $ docker run hello-world $ docker image ls #도커 실행 잘 되는거 확인했으면 컨테이너랑 이미지 삭제하기 #도커 컨테이너명 확인 $ docker ps -a $ docker rm [삭제할 컨테이너명] $ docker rmi hello-world:latest

* 참고 (도커명령어)

#현재 도커 이미지 확인 $ docker images #이미지 삭제 $ docker rmi [imageID] #이미지 삭제하면서 컨테이너도 같이 삭제 $ docker rmi -f [imageID] #실행중인 컨테이너 중지하기 $ docker stop [ContainerID] #모든 컨테이너 중지하기 $ docker stop $(docker ps -a -q) #컨테이너 전체 목록확인 $ docker ps -a #컨테이너 삭제 $ docker rm [ContainerID]

3. Hadoop docker image만들기

* 하둡을 설치할 우분투 컨테이너 생성 및 필요한 패키지 설치, ssh 설정

$ docker run -it --name hadoop-base ubuntu:18.04 #다양한 라이브러리 및 jdk를 설치한다. $ apt-get update $ apt-get install -y net-tools vim iputils-ping wget $ apt-get install -y openssh-server openssh-client $ apt-get install -y openjdk-8-jdk $ java -version $ javac -version # Start the ssh server and check ssh server running $ service ssh restart $ netstat -plant | grep 22 #컨테이너들끼리 로그인절차없이 ssh 접속을 할 수 있도록 키 파일을 생성한다. $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa #Use the 'cat' command to store the public key as authorized_keys in the ssh diretory $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys #Set the permissions for your user with the 'chmod' command $ chmod 0600 ~/.ssh/authorized_keys #The new user is now able to SSH without needing to enter a password every time. #Verify everything is set up correctly by using the hdoop user to SSH to localhost: $ ssh localhost #The following words will come out. #"Are you sure you want to continue connecting?" -> enter 'yes ' #'Missing privilege separation directory: /run/sshd' 오류가 발생하지 않도록 관련 디렉토리도 만들어줍니다. $ mkdir /var/run/sshd

* 하둡 설치

#하둡 홈 디렉터리를 생성하고 하둡 바이너리를 다운로드해서 풀어준다. $ wget https://downloads.apache.org/hadoop/common/hadoop-2.10.1/hadoop-2.10.1.tar.gz $ tar xvzf hadoop-2.10.1.tar.gz

* 하둡 실행을 위한 환경설정

#bashrc를 열어서 환경변수들을 설정해준다. $ vi ~/.bashrc ... export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 #Hadoop Related Options export HADOOP_HOME=/root/hadoop-2.10.1 export HADOOP_CONFIG_HOME=$HADOOP_HOME/etc/hadoop export HADOOP_INSTALL=$HADOOP_HOME export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native" $ source ~/.bashrc #각 데몬들이 홈으로 사용할 경로를 생성한다. $ mkdir /hadoop_home/temp $ mkdir /hadoop_home/namenode_home $ mkdir /hadoop_home/datanode_home #이제 각 데몬들을 위한 하둡 설정파일들을 세팅한다. #먼저 mapred-site.xml파일부터 생성하고 다음 파일들을 클러스터를 위해 수정한다. core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml hadoop-env.sh yarn-env.sh $ cd $HADOOP_CONFIG_HOME $ cp mapred-site.xml.template mapred-site.xml #아래 내용을 추가한다. $ vi core-site.xml hadoop.tmp.dir /root/temp fs.default.name hdfs://master:9000 true $ vi hdfs-site.xml dfs.replication 2 true dfs.namenode.name.dir /root/namenode_home true dfs.datanode.data.dir /root/datanode_home true $ vi mapred-site.xml mapred.job.tracker master:9001 #hadoop-env.sh파일 맨 마지막에 JAVA_HOME 환경변수를 지정해준다. $ vi hadoop-env.sh ... export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 $ vi yarn-site.xml yarn.nodemanager.aux-services mapreduce_shuffle $ vi yarn-env.sh JAVA=$JAVA_HOME/bin/java JAVA_HEAP_MAX=-Xmx1000m $ vi workers master slave1 slave2 #이제 네임노드를 포맷한다. $ cd $ hadoop namenode -format

* 현재까지 컨테이너를 Docker image로 만들기

$ docker commit hadoop-base ubuntu:hadoop

4. Hadoop cluster 구축하기

이제 만들어진 도커 이미지를 이용해서 마스터 노드 하나와 슬레이브 노드 두 개를 구동시켜본다.

터미널을 3개 열어서 다음 명령을 각각 실행한다.

#이때 -p 50070:50070은 로컬의 50070포트를 컨테이너의 50070포트로 포트포워딩해준다는 의미이다. $ docker run -it -h master --name master -p 50070:50070 ubuntu:hadoop $ docker run -it -h slave1 --name slave1 --link master:master ubuntu:hadoop $ docker run -it -h slave2 --name slave2 --link master:master ubuntu:hadoop

현재 3개의 컨테이너가 구동중이지만 아직 하둡 데몬들은 구동되지 않았다.

하둡 데몬을 구동하기 위해서 몇 가지 작업을 해야 한다.

우선 두 개의 슬레이브 노드의 가상 IP주소를 확인한다.

호스트 운영체제에서 도커의 inspect 명령을 이용해서 가상 IP 정보를 확인할 수 있다.

#윈도우 호스트 운영체제라면 $ docker inspect master | findstr "IPAddress" $ docker inspect slave1 | findstr "IPAddress" $ docker inspect slave2 | findstr "IPAddress" #리눅스 운영체제라면 $ docker inspect master | grep IPAddress $ docker inspect slave1 | grep IPAddress $ docker inspect slave2 | grep IPAddress

이제 master 컨테이너에서 호스트 파일을 수정해준다.

$ vi /etc/hosts 172.17.0.3 master 172.17.0.4 slave1 172.17.0.5 slave2 (yy p는 커서가 있는 줄 복사한 뒤 밑에 붙여넣기)

ssh재시작(root계정으로)

모든 서버(master, slave1, slave2) root계정으로

$ service ssh restart #ssh 서버 켜져있는지 확인 $ netstat -plant | grep 22 #master node에서 ssh 접속 잘 되는지 확인하기 $ ssh master $ exit $ ssh slave1 $ exit $ ssh slave2 $ exit

slaves파일 수정하기. 이 파일에는 데이터 노드로 동작할 컨테이너의 목록이 적힌다.

$ cd $HADOOP_CONFIG_HOME $ vi slaves slave1 slave2 master

# 하둡 포맷 한 번 더해준다.

$ hadoop namenode -format Y 입력

이제 'start-all.sh'스크립트로 하둡 클러스터에 각 데몬들을 구동시켜본다.

$ cd $ start-all.sh yes 입력하라고 나오면 yes입력하기

정상적으로 작동되는지 확인

master node

$ jps 837 ResourceManager 968 NodeManager 409 DataNode 1724 Jps 252 NameNode 621 SecondaryNameNode

datanode

$ jps 426 Jps 79 DataNode

#하둡 클러스터의 현 상황 확인하기

$ hdfs dfsadmin -report 'Live datanodes (3)'라는 출력에서 3개의 데이터노드가 구동되고 있음을 확인할 수 있다.

# HDFS에 디렉터리 만들기

$ hadoop fs -mkdir -p /user/dave $ hadoop fs -ls /

# 어드민 웹페이지 들어가기

localhost:50070

5. 간단한 예제 실행(wordcount)

#간단한 워드카운트 예제하기 # 워드카운트위해서 클라이언트 컨테이너를 하나 더 띄워서 클러스터에 붙기 # 호스트 터미널에서 실행 $ docker run -it -h client --name client --link master:master ubuntu:hadoop #테스트를 위해 test 디렉터리를 hdfs에 생성하고, hadoop fs 명령을 이용해서 구축한 클러스터에 LICENSE.txt 파일을 업로드한다. $ cd $HADOOP_HOME $ ls $ hadoop fs -mkdir -p /test $ hadoop fs -put LICENSE.txt /test $ hadoop fs -ls /test #하둡 패키지에 기본적으로 제공되는 jar파일을 이용해서 워드카운트 예제를 실행한다. $ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /test /test_out #워드카운트 결과 확인하기 $ hadoop fs -ls /test_out $ hadoop fs -cat /test_out/*

728x90

from http://earthconquest.tistory.com/396 by ccl(S) rewrite - 2021-11-07 21:27:09