요즘 스파크를 공부중인데, 독립 모드 클러스터를 설치하고 테스트하고 싶어졌다. 마음대로 쓸 수 있는 장비가 없어서 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을 종료한다.