메뉴 건너뛰기

Cloudera, BigData, Semantic IoT, Hadoop, NoSQL

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정보를 알수 있음)

http://sda1:8123/

http://sda2:8123/


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

번호 제목 날짜 조회 수
21 How-to: Tune Your Apache Spark Jobs (Part 2) file 2016.10.31 473
20 VisualVM 1.3.9을 이용한 spark-submit JVM 모니터링을 위한 설정및 spark-submit실행 옵션 2016.10.28 2378
19 java.lang.OutOfMemoryError: unable to create new native thread오류 발생지 조치사항 2016.10.17 1121
18 파일끝에 붙는 ^M 일괄 지우기(linux, unix(AIX)) 혹은 파일내에 있는 ^M지우기 2016.09.24 237
17 start-all.sh로 spark데몬 기동시 "JAVA_HOME is not set"오류 발생시 조치사항 2016.08.01 1245
16 Apache Spark와 Drools를 이용한 CEP구현 테스트 2016.07.15 1112
15 kafka로 부터 메세지를 stream으로 받아 처리하는 spark샘플소스(spark의 producer와 consumer를 sbt로 컴파일 하고 서버에서 spark-submit하는 방법) 2016.07.13 802
14 spark-sql실행시 ERROR log: Got exception: java.lang.NumberFormatException For input string: "2000ms" 오류발생시 조치사항 2016.06.09 405
13 spark-sql실행시 Caused by: java.lang.NumberFormatException: For input string: "0s" 오류발생시 조치사항 2016.06.09 4767
12 spark-sql실행시 The specified datastore driver ("com.mysql.jdbc.Driver") was not found in the CLASSPATH오류 발생시 조치사항 2016.06.09 717
11 ./spark-sql 실행시 "java.lang.NumberFormatException: For input string: "1s"오류발생시 조치사항 2016.06.09 532
10 Scala버젼 변경 혹은 상황에 맞게 Spark소스 컴파일하기 2016.05.31 844
9 spark client프로그램 기동시 "Error initializing SparkContext"오류 발생할때 조치사항 2016.05.27 686
8 spark-submit으로 spark application실행하는 다양한 방법 2016.05.25 473
7 spark 온라인 책자링크 (제목 : mastering-apache-spark) 2016.05.25 464
6 "Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources"오류 발생시 조치사항 2016.05.25 1528
5 spark-env.sh에서 사용할 수있는 항목. 2016.05.24 1178
4 Spark 1.6.1 설치후 HA구성 2016.05.24 1067
3 spark-shell실행시 "A read-only user or a user in a read-only database is not permitted to disable read-only mode on a connection."오류가 발생하는 경우 해결방법 2016.05.20 688
» Spark 2.1.1 clustering(5대) 설치(YARN기반) 2016.04.22 2211
위로