본 포스트에서는 Docker 를 이용하여 spark 클러스터 환경을 구성하는 방법에 대해 설명한다.

Mac local 에서 작업하였다.

spark image 는 Kookmin Univ Bigdata Lab 에서 사용하는 spark image 를 사용한다.

Docker 를 사용하는 자세한 방법은 여기 참고.

Docker 를 설치하는 방법은 여기 적지 않는다.

 

 

 

 

 

1.

spark 이미지를 받는다.

 

sudo docker pull kmubigdata/ubuntu-spark:latest

 

받는데 시간이 좀 걸림

아래 명령어로 image 가 잘 받아졌는지 확인한다.

 

sudo docker images

 

 

 

 

 

2.

네트워크를 만든다.

가장 마지막에 있는 "my-net" 이 지금 만들고자 하는 네트워크의 이름이다.

 

sudo docker network create --subnet 10.0.0.0/24 my-net

 

아래 명령어로 network 잘 만들어졌는지 확인한다.

 

sudo docker network ls

 

subnet 옵션으로, 8bit 네개로 구성된 ip 에서 얼마만큼의 범위로 ip 를 사용할 수 있는지 정할 수 있다.

뒤에 slash 다음에 나오는 숫자만큼, ip 의 앞단 범위가 고정되고, 나머지가 우리가 사용할 수 있는 ip 범위가 된다.

이를테면

 

10.0.0.0/8 는 10.0.0.0 bold 한 곳은 고정되고 나머지 부분이 사용가능하기 때문에,

 10.0.0.1 ~ 10.255.255.254 만큼 사용 가능하다.

 

10.0.0.0/16 은 10.0.0.0 bold 한 곳은 고정되고 나머지 부분이 사용가능하기 때문에,

 10.0.0.1 ~ 10.0.255.254 만큼 사용 가능하다.

 

10.0.0.0/24 은 10.0.0.0 bold 한 곳은 고정되고 나머지 부분이 사용가능하기 때문에,

 10.0.0.1 ~ 10.0.0.254 만큼 사용 가능하다.

 

왜 10.0.0.0 ~ 10.0.0.255 가 아닐까?

왜냐면 사용 가능한 ip 중 가장 앞의 ip (10.0.0.0) 은 Network-ID 으로 사용되고,

사용 가능한 ip 중 가장 뒤의 ip (10.0.0.255) 는 Broadcast 에 사용되기 때문이다.

저 두 ip 는 특수 목적용이기 때문에, 우리 자체적으로 사용할 수 없음.

 

 

참고로 Docker swarm 을 한 상태에서 overlay network 를 만들고 싶다면 아래 명령어 참고

 

sudo docker network create -d=overlay --subnet 10.0.0.0/24 --attachable my-net

 

(swarm 참고 : 링크)

 

 

 

 

 

3.

spark 에 사용할 master, slave-1, slave-2 를 만든다.

master 의 이름은 반드시 master 여야 하지만, slave 의 이름은 마음대로 정하여도 좋다.

master 여야 하는 이유는, 해당 image 의 Docker 내부 세팅이 "master" 라는 이름으로 하드코딩 되어있기 때문이다.

 

sudo docker run -itd --network my-net --name master --ip 10.0.0.2 -p 28088:8088 -p 9870:9870 -p 28080:18080 kmubigdata/ubuntu-spark:latest /bin/bash

sudo docker run -itd --network my-net --name slave-1 --ip 10.0.0.3 -p 28089:8088 kmubigdata/ubuntu-spark:latest /bin/bash

sudo docker run -itd --network my-net --name slave-2 --ip 10.0.0.4 -p 28090:8088 kmubigdata/ubuntu-spark:latest /bin/bash

 

--ip 를 이용하여 일부러 각 container 마다 static 한 ip 를 할당하였다.

--ip 옵션이 없으면 ip 를 자동으로 할당하게 된다.

나중에 해당 container 를 stop, start 하고 나면 ip 가 바뀌고 그것이 문제의 원인이 될 수 있기 때문에 미리 static 하게 만들어둔다.

(port number는 내가 임의로 지정했으므로, 예제로만 보길 바람. 실제로 사용할 땐 port 충돌이 있을 수 있으니 직접 바꿔서 사용하길 바람)

 

-p 옵션을 넣어서 외부 port 를 Docker container 내의 port 로 연결되도록 했다.

-p [외부 port]:[Container 내부 port]

특별히 알아두면 좋은 port number를 여기 적어둔다.

 

 

<해당 내용은 오래된 정보일 수 있으니 최신 정보를 갖고 있는 여기를 참고하자>

 

HDFS : 50070, 19888

Spark : 4040, 8080, 18080

MongoDB : 27017

HBase : 60010

YARN : 8088

 

 

컨테이너들이 잘 동작하고 있는지, 아래 명령어로 확인한다.

 

sudo docker ps -a

 

STATUS 가 exit 이나 create 가 아니라, Up n seconds 여야 한다.

 

 

 

 

port number 에 따라 접근한 webui 의 모습을 보면 아래와 같다.

8080

 

9870
18080

 

 

 

 

 

 

 

4.

아래 명령어로 master container 에 들어간다.

 

sudo docker exec -it master bash

 

컨테이너 내부에서, workers 파일을 수정한다.

 

cd /usr/local/hadoop/etc/hadoop/

vi workers

 

workers 에 있는 localhost 를 지워버리고, 아래 내용으로 대체

 

slave-1

slave-2

 

master 서버에서 slave 을 연결할 때 slave들의 ip 값을 여기 적는건데,

같은 Docker network 에 있는 container 들끼리는, ip 값 대신 container 이름을 대신 적어도 ip 로 인식된다.

 

 

 

 

 

 

5.

아래 명령어로 master 를 slave 들과 잇는다.

해당 Docker image 에서 ssh 연결 세팅을 다 해두었기 때문에 추가적인 작업이 필요하지 않다.

만약 해당 image가 아닌 다른 image 로 spark 환경 구성을 하고 있다면, 각 container 마다 ssh 연결 세팅을 해야 한다.

 

start-all.sh

 

연결이 잘 되었는지 확인하기 위해 아래 두 개의 명령어를 사용해본다.

명령어를 통해 나온 list에서, slave-1 과 slave-2 에 해당하는 녀석들이 있는지 확인해본다.

에러가 나는 명령어가 있다면, 연결에 문제가 있다는 소리.

 

hdfs dfsadmin -report

yarn node -list

 

 

 

 

 

 

6.

아래 명령어로 spark shell 을 실행시켜본다.

 

spark-shell --master yarn

 

만약

2019-08-30 05:04:21 ERROR Main:91 - Failed to initialize Spark session.

java.io.FileNotFoundException: File does not exist: hdfs://master:9000/spark/shared-logs

위의 에러가 나면, 아래 명령어로 hdfs 내에 directory 를 만들어주자.

 

hdfs dfs -mkdir -p /spark/shared-logs

 

spark shell 에서 나오려면 ctrl+c 를 누르거나, quit 를 타이핑 한다.

 

 

 

 

 

7.

spark history server WebUI 를 보기 위해, 아래 명령어를 실행한다.

 

/usr/local/spark/sbin/start-history-server.sh 

 

그리고 웹 브라우저에서 아래 포트로 접근해본다.

 

localhost:28080

 

spark history server WebUI 를 볼 수 있다.

여기서 spark app 이 실행되고 난 후에 정리된 log 들을 볼 수 있다.

(나중에 살펴보니 port 번호가 다르단 것을 알게되어 취소선을 그어놓음. 8088은 hadoop 으로 연결된다.)

 

28080 이란 포트는 어디서 왔는가?

master container 를 처음 만들 때 -p 라는 옵션으로 28080:18080 을 넣어주었다.

"local 컴퓨터에서 28080 으로 접근하면, Docker container 의 18080 으로 연결시켜라" 라는 의미이다.

즉, Docker container 에서 18080 으로 포트를 열어 Web Page 를 띄우고 있고,

우리가 거기에 접근하기 위해선 local 컴퓨터의 28080 로 접근하면 된다는 이야기.

 

docker 의 18080 으로 접근이 안 된다면,

start-history-server.sh 를 실행시킨 후 spark 를 한 번 실행시키면 된다.

 

 

 

+ Recent posts