주요글: 도커 시작하기
반응형

요즘 스파크를 공부중인데, 독립 모드 클러스터를 설치하고 테스트하고 싶어졌다. 마음대로 쓸 수 있는 장비가 없어서 Vagrant를 이용하기로 했다. Vagrant로 리눅스 VM 4개를 생성하고, 4대에 스파크를 설치해서 독립 모드로 클러스터를 만들어봤다.


이 글은 Virtualbox와 Vagrant를 이미 설치했다는 가정하에 진행한다.


1. 준비


Vagrant 설정 파일이 위치할 폴더를 생성한다. 이 글에선 c:\work\spark-vagrant 폴더를 사용한다. 이 폴더를 만들었다면 다음의 두 파일을 c:\work\spark-vagrant\programs 폴더에 다운로드한다.

  • 리눅스용 JDK 1.8 - 이 글에서 다운로드 받은 파일은 jdk-8u73-linux-x64.gz이다.
  • 스파크 1.6.0 - 이 글에서 다운로드 받은 파일은 spark-1.6.0-bin-hadoop2.6.tgz이다.


2. 4개 VM을 위한 Vagrant 설정


Vagrant를 이용해서 VM을 생성할 때 필요한 파일을 만든다.


먼저 vagrant의 insecure_private_key 파일을 복사한다. 이 파일은 ssh 연결 용으로 사용한다.


copy c:\Users\로그인계정\.vagrant.d\insecure_private_key c:\work\spark-vagrant


다음으로 c:\work\spark-vagrant\hosts 파일을 생성한다.


127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.67.101 c6701.spark.apache.org c6701

192.168.67.102 c6702.spark.apache.org c6702

192.168.67.103 c6703.spark.apache.org c6703

192.168.67.104 c6704.spark.apache.org c6704

192.168.67.105 c6705.spark.apache.org c6705

192.168.67.106 c6706.spark.apache.org c6706

192.168.67.107 c6707.spark.apache.org c6707

192.168.67.108 c6708.spark.apache.org c6708

192.168.67.109 c6709.spark.apache.org c6709

192.168.67.110 c6710.spark.apache.org c6710


192.168.67.101부터 192.168.67.110까지 설정은 본인 C:\Windows\System32\drivers\etc\hosts 파일에도 동일하게 추가한다. 


c:\work\spark-vagrant\resolv.conf 파일을 다음과 같이 생성한다.


; generated by /sbin/dhclient-script

search spark.apache.org

nameserver 8.8.8.8


c:\work\spark-vagrant\bootstrap.sh 파일을 다음과 같이 생성한다.


#!/usr/bin/env bash


cp /vagrant/hosts /etc/hosts

cp /vagrant/resolv.conf /etc/resolv.conf

yum install ntp -y

service ntpd start

service iptables stop

chkconfig ntpd on

chkconfig iptables off

mkdir -p /root/.ssh; chmod 600 /root/.ssh; cp /home/vagrant/.ssh/authorized_keys /root/.ssh/

cp /vagrant/insecure_private_key /root/.ssh/id_rsa; chmod 600 /root/.ssh/id_rsa


#Again, stopping iptables

/etc/init.d/iptables stop


# Increasing swap space

sudo dd if=/dev/zero of=/swapfile bs=1024 count=3072k

sudo mkswap /swapfile

sudo swapon /swapfile

echo "/swapfile       none    swap    sw      0       0" >> /etc/fstab


마지막으로 c:\work\spark-vagrant\Vagrantfile 파일을 작성한다.


# -*- mode: ruby -*-

# vi: set ft=ruby :


# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!

VAGRANTFILE_API_VERSION = "2"


Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "centos6.7"

  config.ssh.insert_key = false


  # CentOS 6.7 x86_64, 아래는 한 줄임

  config.vm.box_url = "https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box"


  config.vm.provider :virtualbox do |vb|

    vb.customize ["modifyvm", :id, "--memory", 2048] # RAM allocated to each VM

  end


  config.vm.provision :shell, :path => "bootstrap.sh"


  config.vm.define :c6701 do |c6701|

    c6701.vm.hostname = "c6701.spark.apache.org"

    c6701.vm.network :private_network, ip: "192.168.67.101"

  end


  config.vm.define :c6702 do |c6702|

    c6702.vm.hostname = "c6702.spark.apache.org"

    c6702.vm.network :private_network, ip: "192.168.67.102"

  end


  config.vm.define :c6703 do |c6703|

    c6703.vm.hostname = "c6703.spark.apache.org"

    c6703.vm.network :private_network, ip: "192.168.67.103"

  end


  config.vm.define :c6704 do |c6704|

    c6704.vm.hostname = "c6704.spark.apache.org"

    c6704.vm.network :private_network, ip: "192.168.67.104"

  end


end



3. VM 실행


명령프롬프트를 실행하고 c:\work\spark-vagrant 폴더로 이동해서 vagrant 명령어로 VM을 실행한다.


C:\work\spark-vagrant>vagrant up


4개 VM을 모두 만들었다면 vagrant ssh 명령어로 각 VM에 ssh로 연결되는지 확인한다.


C:\work\spark-vagrant>vagrant ssh c6701

[vagrant@c6701 ~]$ exit

logout

Connection to 127.0.0.1 closed.


C:\work\spark-vagrant>vagrant ssh c6702

[vagrant@c6702 ~]$ exit

logout

Connection to 127.0.0.1 closed.


c6701, c6702, c6703, c6704에 대해 각각 확인한다.


4. 각 VM에 암호 없이 ssh 연결할 수 있는지 확인


앞서 작성한 bootstrap.sh 파일을 보면 insecure_private_key 파일을 root 계정의 인증키로 복사한 것을 알 수 있다. 이를 한 이유는 root 계정으로 c6701, c6702, c6703, c6704 간에 암호 없이 ssh로 연결하기 위함이다. 다음과 같이 su 명령어로 root 계정으로 바꾼 뒤, ssh를 이용해서 다른 호스트에 암호 없이 연결되는지 확인한다.


C:\work\spark-vagrant>vagrant ssh c6701

Last login: Tue Mar  8 05:48:27 2016 from 10.0.2.2

[vagrant@c6701 ~]$ su -

Password: (암호는 vagrant)

[root@c6701 ~]# ssh c6702

The authenticity of host 'c6702 (192.168.67.102)' can't be established.

RSA key fingerprint is 5c:97:4b:96:a2:41:a8:44:cc:70:b1:5e:8d:a7:a5:3b.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added 'c6702,192.168.67.102' (RSA) to the list of known hosts.

[root@c6702 ~]#



5. 각 VM에 JDK와 스파크 설치


c:\work\spark-vagrant 폴더는 /vagrant로 마운트되므로, 다음 명령어를 다운로드 받은 JDK 파일의 압축을 /usr/local에 푼다.


[root@c6701 ~]# ssh c6701 'tar xzf /vagrant/programs/jdk-8u73-linux-x64.gz -C /usr/local'

[root@c6701 ~]# ssh c6702 'tar xzf /vagrant/programs/jdk-8u73-linux-x64.gz -C /usr/local'

[root@c6701 ~]# ssh c6703 'tar xzf /vagrant/programs/jdk-8u73-linux-x64.gz -C /usr/local'

[root@c6701 ~]# ssh c6704 'tar xzf /vagrant/programs/jdk-8u73-linux-x64.gz -C /usr/local'


압축을 풀었다면, java가 제대로 설치됐는지 확인한다.


[root@c6701 ~]# /usr/local/jdk1.8.0_73/bin/java -version

java version "1.8.0_73"

Java(TM) SE Runtime Environment (build 1.8.0_73-b02)

Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode)


비슷한 방식으로 스파크 파일의 압축을 /usr/local에 푼다.


[root@c6701 ~]# ssh c6701 'tar xzf /vagrant/programs/spark-1.6.0-bin-hadoop2.6.tgz -C /usr/local'

[root@c6701 ~]# ssh c6702 'tar xzf /vagrant/programs/spark-1.6.0-bin-hadoop2.6.tgz -C /usr/local'

[root@c6701 ~]# ssh c6703 'tar xzf /vagrant/programs/spark-1.6.0-bin-hadoop2.6.tgz -C /usr/local'

[root@c6701 ~]# ssh c6704 'tar xzf /vagrant/programs/spark-1.6.0-bin-hadoop2.6.tgz -C /usr/local'


6. spark-env.sh 파일 작성


각 VM(c6701, c6702, c6703, c6704)에서 /usr/local/spark-1.6.0-bin-hadoop2.6/conf 폴더로 이동한 뒤 spark-env.sh 파일을 작성한다. 먼저 spark-env.sh.template 파일을 복사해서 spark-env.sh 파일을 생성한다.


[root@c6701 ~]# cd /usr/local/spark-1.6.0-bin-hadoop2.6/conf

[root@c6701 conf]# cp spark-env.sh.template spark-env.sh


spark-env.sh 파일의 맨 마지막에 JAVA_HOME 환경변수를 추가한다.


# spark-env.sh 파일 마지막에 추가한다.

JAVA_HOME=/usr/local/jdk1.8.0_73


c6701에 spark-env.sh을 만든 뒤, 다음과 같이 scp를 이용해서 복사해도 된다.


[root@c6701 conf]# scp spark-env.sh root@c6702:/usr/local/spark-1.6.0-bin-hadoop2.6/conf

spark-env.sh     100% 4243     4.1KB/s   00:00



7. slaves 파일 작성


slaves 파일은 마스터 역할을 할 c6701 장비에만 작성한다. /usr/local/spark-1.6.0-bin-hadoop2.6/conf 위치에 다음과 같이 slaves 파일을 생성한다.


c6702

c6703

c6704



8. 스파크 단독 모드 클러스터 실행


자, 이제 클러스터를 실행할 차례이다. c6701의 /usr/local/spark-1.6.0-bin-hadoop2.6 에서 sbin/start-all.sh을 이용해서 마스터와 워커를 실행한다.


[root@c6701 spark-1.6.0-bin-hadoop2.6]# sbin/start-all.sh

starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.master.Master-1-c6701.spark.apache.org.out

c6702: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-c6702.spark.apache.org.out

c6704: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-c6704.spark.apache.org.out

c6703: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-c6703.spark.apache.org.out

[root@c6701 spark-1.6.0-bin-hadoop2.6]#


마스터와 워커를 실행했으니 이제 확인할 차례다. http://c6701.spark.apache.org:8080 주소를 웹 브라우저에 입력해보자. 잠시 후 다음과 같은 결과 화면을 볼 수 있을 것이다.



9. 스파크 클러스터 종료와 vagrant 종료


sbin/stop-all.sh을 사용하면 스파크 클러스터를 종료한다.


VM에서 로그아웃한 뒤, 명령 프롬프트에서 vagrant halt 명령어를 실행하면 전체 VM을 종료한다.






+ Recent posts