Cluster : The Beginning - Spark 2.2.1 설치


이제 클러스터 구축의 마지막 포스팅이다!
엄밀하게 말해 제대로 된 테스트를 진행하지 않았으니 껍데기만 설치해놓으 것이나 다름 없지만
이 분야의 초보자나 다름 없는 입장에서 일단 이렇게나마 설치를 해놓고 실제 데이터를 분석하면서 부족한
부분을 채워 나가는 것이 더 바람직하지 않나 하는 판단이다.


사실 Kafka 이후 어떤 내용을 더 추가할 것인가 고민을 좀 했었다. 워낙 방대한 하둡 생태계에서 무엇을 선택해야 할지
길을 잃었다고 하는 것이 옳은 표현이겠다. 하지만 선택은 빨랐다. 하둡 생태계의 많은 시스템들이 주목을 받고 있지만
그 중에서도 Spark의 지위는 상당한 것으로 보였다. 게다가 아무래도 머신러닝과 딥러닝 등 인공 지능이 대세인 이 
시점에서 머신 러닝 라이브러리인 Spark ML을 제공해주는 Spark는 분명 배워볼만한 시스템임이 틀림 없었다.


다만…In-Memory 시스템인 Spark를 겨우 8Gb 메모리를 장착한 가정용 PC 5대로 원활히 돌려볼 수 있을지는
의문이다.


사전 준비


Spark의 클러스터 관리를 위한 시스템 설치(Mesos또는 Hadoop YARN) 외에 특별한 사전 준비가 필요한 것은 
아니지만 JAVA 버전은 1.8.X 이상이어야 한다. 공식 문서에 보니 2.1.X 버전에서는 JAVA 1.7까지 지원했으나
2.2.0으로 버전이 올라가면서 1.8 이상을 필요로 하게 되었다.


설치


타 시스템과 다를 바 없이 먼저 바이너리 압축 파일을 다운로드 받는다 내가 받은 파일은 아래와 같다.


spark-2.2.1-bin-hadoop2.7.tar.gz


앞선 포스팅에서도 언급했듯이 나는 현재 모든 하둡 생태계의 시스템들을 /opt 아래에 설치하고 있기에 Spark 역시
/opt 압축을 풀었다. 생성된 디렉토리에서 버전정보는 뺐기 때문에 최종 경로는 /opt/spark가 되었다.


설정


기본적인 설정 파일은 spark-defaults.conf와 slaves 파일이며 cluster 모드로 설정하기 위해서는 spark-env.sh에
필요한 환경 변수를 설정해주면 된다. 나는 YARN을 이용한 cluster모드로 설치하기로 했기에 다음과 같이 설정하였다.


spark-env.sh

export JAVA_HOME=/Library/Java/Home
export HADOOP_HOME=/opt/hadoop
export SPARK_HOME=/opt/spark

##하둡과 YARN의 설정파일 경로를 추가해준다.
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop


spark-defaults.conf

## 클러스터 매니저가 접속할 마스터 서버 URI
spark.master                     spark://SECONDARY-NAMENODE.local:7077
##Spark 이벤트를 기록할지 여부. 응용 프로그램이 완료된 후 웹 UI를 재구성하는 데 유용
spark.eventLog.enabled           true

# spark.eventLog.dir               hdfs://NAMENODE.local:8021/sparkdir
##이벤트 로그를 기록할 경로
spark.eventLog.dir		 file:///opt/spark/sparkeventlog

##네트워크를 통해 전송되거나 직렬화 된 형식으로 캐시되어야하는 객체를 직렬화하는 데 사용할 클래스
spark.serializer                 org.apache.spark.serializer.KryoSerializer

##드라이버 프로세스, 즉 SparkContext가 초기화되는 곳에 사용할 메모리 크기
##클라이언트 응용프로그램에서 직접 변경하면 안됨
spark.driver.memory              2g

##YARN 관련 설정들

##YARN 응용 프로그램 마스터에 사용할 메모리 크기
##클러스터 모드에서는 spark.driver.memory를 사용하라는데...필요 없는 설정일지도...-.-
spark.yarn.am.memory             1g

##정적 할당에 대한 집행자의 수. spark.dynamicAllocation.enabled를 사용하면 실행 프로그램의 
##초기 세트가 최소한이 정도 커짐
spark.executor.instances           2
# spark.executor.extraJavaOptions  -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"

##실행 프로그램에 추가할 JVM 옵션 설정. 스파크 속성 또는 최대 힙 크기 (-Xmx) 설정을 지정하는 것은 안됨
spark.executor.extraJavaOptions        -Dlog4j.configuration=file:/opt/spark/conf/log4j.properties

##드라이버에 추가할 JVM 옵션 설정. 스파크 속성 또는 최대 힙 크기 (-Xmx) 설정을 지정하는 것은 안됨
spark.driver.extraJavaOptions        -Dlog4j.configuration=file:/opt/spark/conf/log4j.properties


slaves

##슬레이브 노드로 사용할 서버들의 호스트명
DATANODE1.local
DATANODE2.local
DATANODE3.local


마지막으로 이전 포스팅에서도 언급한 바와 같이 Mac에 설치하는 경우 spark-env.sh파일에서 nohup으로 시작하는
명령행에서는 nohup을 삭제한 후 실행시켜야 한다.


클러스터 노드에 배포


설정이 모두 끝났으면 전체 배포본을 압축하여 클러스터를 구성할 각 노드들에 복사를 해준다.
나는 DATANODE1.local, DATANODE2.local,DATANODE3.local 3대의 노드를 슬레이브 노드로 사용하기에
아래와 같이 복사를 해주었다.


$ scp spark.tar.gz hadoop@DATANODE1.local:/opt
$ scp spark.tar.gz hadoop@DATANODE2.local:/opt
$ scp spark.tar.gz hadoop@DATANODE3.local:/opt

그리고 각각의 노드에서 압축을 풀어주면 된다.


실행


마스터 노드에서 아래와 같이 실행한다.

$ /opt/spark/sbin/start-all.sh 


실행 확인


마스터 노드에서 포트번호 8080으로 접속하게 되면 Spark 관리 콘솔이 브라우저 화면에 보여진다.



정리


이렇게 Spark를 마지막으로 클러스터를 구성하는 1차 목표가 완료되었다.
물론 이후에도 몇가지 목적에 의해 openTSDB를 추가로 설치하였으며 앞으로 또 어떤 시스템을 더 설치하게 될지
모르겠다. 하지만 애초에 설치를 목표로 했던 시스템들은 모두 설치가 되었다.


하지만 구슬이 서말이라도 꿰어야 보배라고…이렇게 설치한 클러스터를 이용하여 실제 데이터의 흐름을 이해하고
또 이렇게 모아진 데이터를 분석하는 더 큰일이 남아있다. 


전에도 말했지만 이미 Spark까지의 모든 시스템은 1월 초에 모두 설치가 완료되었고 이 블로그를 정리하는 시점에는 


아두이노를 이용한 온도/습도/먼지 센서를 이용하여 데이터를 수집하는 작업을 시작했는데 역시나 생각만큼 쉽지 않다.
잠시 쉬는 기간이라 생각하고 차근차근 연구를 해봐야 할 것 같다.


본격적인 싸움은 이제부터다!!!

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

티스토리 툴바