Cloudera CDH/CDP 및 Hadoop EcoSystem, Semantic IoT등의 개발/운영 기술을 정리합니다. gooper@gooper.com로 문의 주세요.
1. 다운로드
http://www.apache.org/dyn/closer.lua/spark/spark-2.1.1/spark-2.1.1-bin-hadoop2.7.tgz
* YARN 클러스터환경에서 작동되는 spark버젼을 다운받는다.
2. upload및 압축풀기
sudo tar xvfz spark-2.1.1-bin-hadoop2.7.tgz
3. conf파일 생성및 내용수정(root계정으로 실행)
가. sudo cp conf/slaves.template slaves
가-1. vi slaves
sda2
sda3
sda4
sda5
나. cp conf/spark-defaults.conf.template spark-defaults.conf
spark.master spark://sda1:7077,sda2:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://mycluster/user/hadoop/spark
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.driver.memory 5g
# spark.executor.extraJavaOptions -XX:+PrintGCDetails -XX:MaxDirectMemorySize=67108864 -XX:+HeapDumpOnOutOfMemoryError -Dkey=value -Dnumbers="one two three"
spark.executor.extraJavaOptions -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Dkey=value -Dnumbers="one two three"
: Kafka로부터 메세지를 받는 spark용 client프로그램 구동시 파일을 읽는 등의 처리가 갑자기 증가하게되는 상황이되면 OutOfMemoryError가 발생할 수 있는데 이것은 NIO관련 라이브러리가 0(무제한)의 DirectMemoryBuffer를 제공함으로서 모든 메모리를 소진하기 때문인데.. 이럴때는 파일엑세스가 몰리는 프로그램의 JVM(예, tomcat)기동시 -XX:MaxDirectMemorySize(예, 2G(2147483648), 2*1024*1024*1024)등을 지정하여 무제한으로 증가하지 않도록 설정해준다.
다. hadoop경로 생성(spark.eventLog.dir의 경로를 생성함, 생성하지 않으면 bin/spark-shell실행시 오류발생함) :
hadoop fs -mkdir hdfs://mycluster/user/hadoop/spark
라. cp conf/spark-env.sh.template spark-env.sh
export JAVA_HOME=/opt/jdk1.8.0_66
export SPARK_SSH_OPTS=" -p 10022 " #ssh 포트가 변경된 경우 추가
export SPARK_MASTER_WEBUI_PORT=8123 #master webui의 port가 변경할 경우 추가 (defautl:8080)
export SPARK_LOG_DIR=/logs/spark #log파일 위치
export SPARK_WORKER_MEMORY=5g #worker당 사용가능한 메모리
export SPARK_WORKER_CORES=10 #Worker당 사용가능한 코어수
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=3" #어플리케이션에 디폴트로 할당되는 코어수
export SPARK_HISTORY_OPTS=" -Dspark.history.fs.logDirectory=hdfs://mycluster/user/hadoop/spark"
# event log를 웹어서 볼수 있도록 설정한다(http://sda1:18080으로 조회할 수 있다)
*설정값(예시)
export JAVA_HOME=/opt/jdk1.8.0_66
export SPARK_MASTER_WEBUI_PORT=8123
export SPARK_LOG_DIR=/logs/spark
export SPARK_SSH_OPTS=" -p 22 "
export STANDALONE_SPARK_MASTER_HOST=sda1,sda2
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=sda1:2181,sda2:2181,sda3:2181"
export SPARK_WORKER_MEMORY=5g
export SPARK_WORKER_CORES=10
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=3"
export SPARK_HISTORY_OPTS=" -Dspark.history.fs.logDirectory=hdfs://mycluster/user/hadoop/spark"
#export CLASSPATH=$CLASSPATH:/svc/apps/gsda/bin/hadoop/spark/lib/mysql-connector-java-5.1.39-bin.jar #mysql의 경우
export CLASSPATH=$CLASSPATH:/svc/apps/gsda/bin/hadoop/spark/lib/mariadb-java-client-1.5.9.jar #mariadb의 경우
(주의 : spark-2.0.0-bin-hadoop2.7이상의 버젼은 lib폴더가 없으므로 만들어서 mysql-connector.. 파일을 여기에 복사해줄것, mariadb의 경우는 mariadb-java-client-1.5.4.jar를 복사해준다.)
(참조사이트 #1(mariadb) : https://mariadb.com/kb/en/mariadb/about-mariadb-connector-j/
#2(mysql) : https://dev.mysql.com/downloads/connector/j/)
* 추가적인 설정값은 https://www.gooper.com/ss/index.php?mid=bigdata&category=2773&page=2&document_srl=3125 를 참조할것
(예, export SPARK_WORKER_MEMORY=5g
export SPARK_WORKER_CORES=10
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=3"
로 지젇하는 경우 start-all.sh할때 각서버에 worker가 4개씩 기동하며 각 worker당 core 10개, 메모리는 5g씩 사용하게 된 다. 특히 SPARK_MASTER_OPTS을 지정하지 않으면 동시에 여러프로그램을 사용할수 없는 문제("Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources"라는 WARN이 발생하며 어플리케이션이 수행되지 않고 대기하게됨)가 발생한다. 하지만 stop-all.sh로 중지시키면 서버당 4개씩 기동된(SPARK_WORKER_INSTANCE=4로 지정한 경우, 1.x이상에서 삭제됨) Worker를 모두 중지시켜 주지 못한다는 문제점이 있음)
마. cp log4j.properties.template log4j.properties
(*참고: $HOME/spark/logs가 defualt log파일의 위치임)
바. conf/ha.conf(개별 기동 하면서 HA를 구성할때 사용됨, https://www.gooper.com/ss/index.php?mid=bigdata&category=2773&page=2&document_srl=3124)
#SPARK_DAEMON_JAVA_OPTS="spark.deploy.recoveryMode=ZOOKEEPER spark.deploy.zookeeper.url=sda1:2181,sda2:2181,sda3:2181 spark.deploy.zookeeper.dir=/spark"
spark.deploy.recoveryMode=ZOOKEEPER
spark.deploy.zookeeper.url=sda1:2181,sda2:2181,sda3:2181
spark.deploy.zookeeper.dir=/spark
4. 각 서버에 복사한다(sda1 : master, 나머지 : worker) - root로 실행
scp -r -P XXX spark-2.1.1-bin-hadoop2.7 root@sda2:$HOME
scp -r -P XXX spark-2.1.1-bin-hadoop2.7 root@sda3:$HOME
scp -r -P XXX spark-2.1.1-bin-hadoop2.7 root@sda4:$HOME
scp -r -P XXX spark-2.1.1-bin-hadoop2.7 root@sda5:$HOME
* 각 서버에 복사하고 링크를 생성해줘야한다.
- ln -s spark-2.1.1-bin-hadoop2.7 spark
- hive가 설치되고 hive에서 설정한 metastore를 사용하기 위해서 spark/conf밑에 hive-site.xml의 링크를 생성한다.
(예, ln -s /opt/hadoop/hive/conf/hive-site.xml hive-site.xml)
- hadoop의 core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml에 대한 링크를 spark/conf밑에 생성한다.
(예:
ln -s $HOME/hadoop/etc/hadoop/core-site.xml core-site.xml
ln -s $HOME/hadoop/etc/hadoop/hdfs-site.xml hdfs-site.xml
ln -s $HOME/hadoop/etc/hadoop/mapred-site.xml mapred-site.xml
ln -s $HOME/hadoop/etc/hadoop/yarn-site.xml yarn-site.xml
ln -s $HOME/hive/conf/hive-site.xml hive-site.xml (hive와 spark를 연동하는 경우 추가해줌, hive가 설치된 곳만(?))
)
5. Spark의 Master데몬을 수동으로 실행(active용 서버와 standby서버에서 실행시켜줌) - root로 실행
가. ./sbin/start-master.sh (conf폴더에 설정된 spark-default.xml을 이용하여 환경을 설정한다)
나. ./sbin/start-master.sh --host sda1 --webui-port 8123
(conf폴더에 관련 옵션을 설정한 경우는 ./sbin/start-master.sh만 실행시켜준다, conf/spark-env.sh에 옵션을 지정하고 command에서 동일한 옵션을 지정하면 중복 지정된다.)
(export SPARK_MASTER_WEBUI_PORT=8123)
==>
starting org.apache.spark.deploy.master.Master, logging to /hadoop/spark/logs/spark-root-org.apache.spark.deploy.master.Master-1-sda1.out
* spark master daemon만 수동으로 내리기 : ./sbin/stop-master.sh
* master서버에서 master와 slave들을 한번에 모두 기동하려면 ./sbin/start-all.sh을 실행한다.
(중지할 경우는 ./sbin/stop-all을 실행한다)
5-1. Master, Worker를 기동시켜준다.
./sbin/start-all.sh
6. 데몬확인(jps -m)
142292 Master --ip sda1 --port 7077 --webui-port 8080 --host sda1 --webui-port 8123
* Worker노드를 수동으로 기동하기(각 Worker 노드에서 실행한다)
./sbin/start-slave.sh spark://sda1:7077,sda2:7077
starting org.apache.spark.deploy.worker.Worker, logging to /hadoop/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-sda2.out
* Worker데몬 확인(jps -m)
15713 Worker --webui-port 8081 spark://sda1:7077
* Worker stop : sbin/stop-slave.sh
*브라우져로 확인(Master데몬이 기동된 서버에서 브라우징하면 Master와 Worker정보를 알수 있음)
7. master와 slave 모두 한번에 기동하는 script(root로 실행)
./sbin/start-all.sh(기동)
./sbin/stop-all.sh(중지)
* script용도
가. sbin/start-master.sh - script를 실행하는 서버에서 master instance를 기동한다.
나. sbin/start-slaves.sh -conf/slaves파일에 지정된 서버들에서 slave instance를 기동한다.
다. sbin/start-slave.sh - script를 실행하는 서버에서 slave instance를 기동한다.
라. sbin/start-all.sh - 위에서 설명한 slave들, master를 모두 기동한다.
마. sbin/stop-master.sh - bin/start-master.sh script를 이용하여 기동한 master instance를 종료한다.
바. sbin/stop-slaves.sh - conf/slaves파일에 지정된 모든 slave instance를 종료한다.
사. sbin/stop-all.sh - 위에서 설명한 master와 slave를 보두 종료한다.
8. event history서버 기동(master노드에서 root로 실행)
./sbin/start-history-server.sh
* http://sda1:18080으로 event history를 조회할 수 있다
9. hive thrift server기동(필요시, master노드에서 root로 실행)
./sbin/start-thriftserver.sh
10. spark-shell 실행하기(root가 아닌 다른 계정(예, hadoop)으로 실행)
./bin/spark-shell --master spark://sda1:7077,sda2:7077
(conf/spark-defaults.conf파일에 spark.master spark://sda1:7077,sda2:7077로 지정하면 spark-shell등의 실행시 --master를 지정하지 않아도 됨)
11. test(hadoop 계정으로 수행)
가. HDFS에 a.txt파일 업로드 : hadoop fs -put a.txt
나. spark-shell프로그램 실행 : ./bin/spark-shell
다. spark-shell에서 test용 프로그램 실행
- HDFS에 있는 b.txt파일을 RDD로 변환 : scala> val textFile = sc.textFile("b.txt")
- 전체 라인수 count수행 : scala> textFile.count()
- "aa"단어가 있는 라인 count 수행 : scala> textFile.filter(line => line.containts("aa")).count()
* ./bin/spark-sql 실행시 오류가 나면
https://www.gooper.com/ss/index.php?mid=bigdata&category=2773&page=2&document_srl=3153 를 참조하여 조치하여준다.
* HA구성 : https://www.gooper.com/ss/index.php?mid=bigdata&category=2773&page=2&document_srl=3124 를 참조한다.
*참고
http://igoto.x-y.net/xe/linux/154
https://spark.apache.org/docs/latest/spark-standalone.html
http://hoondongkim.blogspot.kr/2014/10/spark-3-stand-alone-on-cluster.html
http://hoondongkim.blogspot.kr/2015/10/spark-yarn-cluster-vs-spark-mesos_20.html
http://hoondongkim.blogspot.kr/2015/10/spark-yarn-cluster-vs-spark-mesos.html