2021. 1. 22. 12:00ㆍ교육과정/KOSMO
키워드 : 스파크 설치 ( Spark ) / 스파크를 로컬 및 클러스터로 구동하기 /
****
1. 스파크 설치
(1) 스파크 다운로드
① dn01 노드에서 root 계정으로 로그인한다.
( 설치 후 사용 권한을 hadoop 계정으로 변경할 예정 )
[hadoop@dn01 ~]$ su - root
Password:
Last login: Thu Jan 21 11:45:04 UTC 2021 on pts/1
② tmp 디렉토리로 이동 후 wget 명령어로 spark 패키지를 다운받는다.
[root@dn01 ~]# cd /tmp
[root@dn01 tmp]# wget http://apache.mirror.cdnetworks.com/spark/spark-2.4.7/spark-2.4.7-bin-hadoop2.7.tgz
....
Saving to: ‘spark-2.4.7-bin-hadoop2.7.tgz’
100%[====================================================>] 233,333,392 54.7MB/s in 4.1s
2021-01-21 15:10:47 (53.7 MB/s) - ‘spark-2.4.7-bin-hadoop2.7.tgz’ saved [233333392/233333392]
③ tar 명령어를 사용하여 다운 받은 파일의 압축을 해제한다.
압축 해제 후 spark-2.4.7-bin-hadoop2.7 디렉토리가 생성되었음을 확인할 수 있다.
[root@dn01 tmp]# tar xzvf spark-2.4.7-bin-hadoop2.7.tgz
[root@dn01 tmp]# ls
...
spark-2.4.7-bin-hadoop2.7
...
④ 2.4.7 이름의 디렉토리 생성 후 압축 해제한 파일들 전체를 옮긴다
[root@dn01 tmp]# mkdir -p /opt/spark/2.4.7
[root@dn01 tmp]# mv spark-2.4.7-bin-hadoop2.7/* /opt/spark/2.4.7/
[root@dn01 tmp]# ls /opt/spark/2.4.7/
bin data jars LICENSE NOTICE R RELEASE yarn
conf examples kubernetes licenses python README.md sbin
⑤ 2.4.7 디렉토리에 대해 current 라는 이름의 심볼릭링크를 생성한 뒤,
spark 디렉토리와 그 하위 파일들의 소유자를 hadoop 계정으로 변경한다.
[root@dn01 tmp]# ln -s /opt/spark/2.4.7 /opt/spark/current
[root@dn01 tmp]# chown -R hadoop:hadoop /opt/spark/
[root@dn01 ~]# ll /opt/spark/
total 0
drwxr-xr-x. 13 hadoop hadoop 211 Jan 21 15:13 2.4.7
lrwxrwxrwx. 1 hadoop hadoop 16 Jan 21 15:13 current -> /opt/spark/2.4.7
⑥ hadoop 계정으로 로그인한다.
[root@dn01 tmp]# su - hadoop
(2) 스파크 환경변수 추가
① hadoop 계정으로 로그인한다.
[root@dn01 tmp]# su - hadoop
② vi 에디터로 . bash_profile 파일을 연 뒤 $SPARK_HOME 이라는 환경변수를 추가한다.
[hadoop@dn01 ~]$ vi ~/.bash_profile
###### spark ######################
export SPARK_HOME=/opt/spark/current
export PATH=$PATH:$SPARK_HOME/bin
export PATH=$PATH:$SPARK_HOME/sbin
#### spark ######################
③ source 명령어를 사용하여 변경된 환경변수를 적용한다.
[hadoop@dn01 ~]$ source ~/.bash_profile
(3) 스파크 설정 변경하기
① $SPARK_HOME 경로의 conf 디렉토리로 이동한다.
[hadoop@dn01 ~]$ cd $SPARK_HOME/conf
② 템플릿 파일로부터 conf, properties, sh 파일을 생성한다.
[hadoop@dn01 conf]$ ls
docker.properties.template metrics.properties.template spark-env.sh.template
fairscheduler.xml.template slaves.template
log4j.properties.template spark-defaults.conf.template
[hadoop@dn01 conf]$ cp slaves.template slaves
[hadoop@dn01 conf]$ cp spark-defaults.conf.template spark-defaults.conf
[hadoop@dn01 conf]$ cp log4j.properties.template log4j.properties
[hadoop@dn01 conf]$ cp spark-env.sh.template spark-env.sh
③ 각 파일을 열어 설정을 추가한다.
[slaves] 파일에 localhost 를 지우고 아래 스크립트로 변경
nn01
dn02
[spark-defaults.conf] 파일에서 아래 스크립트를 추가
spark.yarn.jars /opt/spark/current/jars/*
[log4j.properties] 파일에서 INFO 를 ERROR 로 변경
( 본래 Spark 에는 INFO 가 정신없이 나타나므로 에러만 출력하도록 변경하는 것 )
log4j.rootCategory=ERROR, console
[spark-env.sh] 파일에 아래 스크립트를 추가
SPARK_MASTER_HOST=dn01
export JAVA_HOME=/opt/jdk/current
export HADOOP_HOME=/opt/hadoop/current
export SPARK_HOME=/opt/spark/current
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_DRIVER_MEMORY=2g
export SPARK_EXECUTOR_INSTANCES=2
export SPARK_EXECUTOR_CORES=1
export SPARK_EXECUTOR_MEMORY=2g
export SPARK_MASTER_IP=192.168.56.102
#export SPARK_WORKER_DIR=/spark_data/spwork
#export SPARK_PID_DIR=/spark_data/sptmp
export SPARK_DIST_CLASSPATH=$(/opt/hadoop/current/bin/hadoop classpath):/opt/spark/current/jars/*
#export PYTHONPATH=/opt/python/current/python3
#export PYSPARK_PYTHON=/opt/python/current/python3
(4) 스파크 실행 및 일부 설정 변경하기
① spark-shell 을 입력하여 스파크를 실행한다.
[hadoop@dn01 ~]$ spark-shell
② 스파크에서 scala 사용 예제
sc.setLogLevel("WARN")
val f = sc.textFile("file:///etc/hosts")
f.count
f.first
f.collect
:quit
(5) nn01 과 dn02 노드에 스파크 복사하기
① sudo 명령어를 사용하여 /opt/spark 디렉토리를 복사한다.
( hadoop 계정의 비밀번호 hadoop / yes / root 계정의 비밀번호 vagrant )
[hadoop@dn01 ~]$ sudo scp -r /opt/spark dn02:/opt/spark
[hadoop@dn01 ~]$ sudo scp -r /opt/spark nn01:/opt/spark
※ 또는 root 계정으로 접속 후 scp 명령어 사용하여 복사할 수 있다.
[root@dn01 ~]$ scp -r /opt/spark dn02:/opt/spark
[root@dn01 ~]$ scp -r /opt/spark nn01:/opt/spark
② 각 노드에서 스파크가 복사되었는지 확인한다.
[hadoop@nn01 ~]$ ll /opt/spark/
total 0
drwxr-xr-x. 13 root root 211 Jan 21 16:07 2.4.7
drwxr-xr-x. 13 root root 211 Jan 21 16:07 current
[hadoop@dn02 ~]$ ll /opt/spark/
total 0
drwxr-xr-x. 13 root root 211 Jan 21 16:05 2.4.7
drwxr-xr-x. 13 root root 211 Jan 21 16:05 current
(6) nn01 과 dn02 노드로 복사한 파일의 심볼릭링크 생성하기
① dn01 은 심볼릭링크가 존재하지만, nn01 과 dn02 는 심볼릭링크가 없는 일반 디렉토리이다.
② nn01 과 dn02 노드에서 root 계정으로 로그인한다.
[hadoop@dn02 ~]$ su - root
Password:
Last login: Thu Jan 21 01:06:48 UTC 2021 from 192.168.56.1 on pts/0
[root@dn02 ~]#
③ 기존 심볼릭링크로 만들었던 current 디렉토리를 지우고, 새롭게 심볼릭링크를 생성한다.
[root@dn02 ~]# rm -rf /opt/spark/current
[root@dn02 ~]# ln -s /opt/spark/2.4.7 /opt/spark/current
④ 심볼릭링크 생성 결과를 확인한다.
[root@dn02 ~]# ll /opt/spark/
total 0
drwxr-xr-x. 13 root root 211 Jan 21 16:05 2.4.7
lrwxrwxrwx. 1 root root 16 Jan 21 16:15 current -> /opt/spark/2.4.7
⑤ spark 디렉토리의 소유자를 hadoop 계정으로 변경한다.
[root@dn02 ~]# chown -R hadoop:hadoop /opt/spark/
[root@dn02 ~]# ll /opt/spark/
total 0
drwxr-xr-x. 13 hadoop hadoop 211 Jan 21 16:05 2.4.7
lrwxrwxrwx. 1 hadoop hadoop 16 Jan 21 16:15 current -> /opt/spark/2.4.7
⑥ hadoop 계정으로 로그인한다.
[root@dn02 ~]# su - hadoop
Last login: Thu Jan 21 12:45:49 UTC 2021 from 192.168.56.102 on pts/1
[hadoop@dn02 ~]$
(7) nn01 과 dn02 노드에서 환경변수 생성하기
① 복사해온 노드에서는 환경변수가 설정되어 있지 않기 때문에 두 노드에 별도로 추가해준다.
② vi 에디터로 . bash_profile 파일을 연 뒤 $SPARK_HOME 이라는 환경변수를 추가한다.
[hadoop@nn01 ~]$ vi ~/.bash_profile
[hadoop@dn02 ~]$ vi ~/.bash_profile
###### spark ######################
export SPARK_HOME=/opt/spark/current
export PATH=$PATH:$SPARK_HOME/bin
export PATH=$PATH:$SPARK_HOME/sbin
#### spark ######################
③ source 명령어를 사용하여 변경된 환경변수를 적용한다.
[hadoop@nn01 ~]$ source ~/.bash_profile
[hadoop@dn02 ~]$ source ~/.bash_profile
2. 스파크를 로컬 및 클러스터로 구동하기
(1) 스파크를 로컬에서 구동하기
① 각 노드의 hadoop 계정에서 로컬로 스파크 쉘을 구동하여 콘솔로 들어갈 수 있다.
spark-shell -> scala 사용 scala>
pyspark -> python 사용 >>>
② 스파크를 종료하고자 할 때는, 실행한 스파크 콘솔 따라 빠져나가는 명령어를 입력한다.
scala> :quit
>>> exit()
(2) 스파크를 클러스터로 구동하기
스파크 구동 → 스파크 콘솔 실행 |
① 세 노드에 모두 스파크가 설치되었으므로,
하둡처럼 스파크도 여러 클러스터를 유기적으로 연결해서 실행할 수 있다.
② 하지만, 스파크의 클러스터 구동 명령어가 하둡의 구동 명령어와 동일하므로,
별도로 명시하지 않을 경우 하둡이 구동한다.
[hadoop@dn01 ~]$ start-all.sh -> 하둡 구동 됨
③ 따라서, 스파크의 경로를 명시하여 구동 / 종료해줘야 한다.
[hadoop@dn01 ~]$ $SPARK_HOME/sbin/start-all.sh
[hadoop@dn01 ~]$ $SPARK_HOME/sbin/stop-all.sh
- dn01 은 Master 로,
- dn02 와 nn01 은 Worker 로 사용되고 있었음을 확인할 수 있다.
④ 또는 스파크의 설치 경로까지 들어간 다음, 현재 디렉토리를 명시하여 스파크를 구동 / 종료한다.
[hadoop@dn01 ~]$ cd $SPARK_HOME/sbin
[hadoop@dn01 sbin]$ pwd
/opt/spark/current/sbin
[hadoop@dn01 sbin]$ ./start-all.sh
[hadoop@dn01 sbin]$ ./stop-all.sh
⑤ 마스터인 dn01 에서 7077 포트로 스파크 콘솔을 실행한다.
[hadoop@dn01 sbin]$ spark-shell --master spark://dn01:7077