메뉴 건너뛰기

Bigdata, Semantic IoT, Hadoop, NoSQL

Bigdata, 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

번호 제목 글쓴이 날짜 조회 수
739 bananapi 5대(ubuntu계열 리눅스)에 yarn(hadoop 2.6.0)설치하기-ResourceManager HA/HDFS HA포함, JobHistory포함 총관리자 2015.04.24 19143
738 mapreduce appliction을 실행시 "is running beyond virtual memory limits" 오류 발생시 조치사항 총관리자 2017.05.04 16895
737 org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/hadoop-root/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible. 구퍼 2013.03.11 14781
736 drop table로 삭제했으나 tablet server에는 여전히 존재하는 테이블 삭제방법 총관리자 2021.07.09 7550
735 insert hbase by hive ... error occured after 5 hours..HMaster가 뜨지 않는 장애에 대한 복구 방법 총관리자 2014.04.29 7129
734 Resource temporarily unavailable(자원이 일시적으로 사용 불가능함) 오류조치 총관리자 2015.11.19 6817
733 HBase shell로 작업하기 구퍼 2013.03.15 5834
732 dr.who로 공격들어오는 경우 조치방법 file 총관리자 2018.06.09 5603
731 하둡 분산 파일 시스템을 기반으로 색인하고 검색하기 구퍼 2013.03.15 5573
730 [Decommission]시 시간이 많이 걸리면서(수일) Decommission이 완료되지 않는 경우 조치 총관리자 2018.01.03 5294
729 Ubuntu 16.04LTS 설치후 초기에 주어야 하는 작업(php, apache, mariadb설치및 OS보안설정등) file 총관리자 2017.05.23 5268
728 hive 2.0.1 설치및 mariadb로 metastore 설정 총관리자 2016.06.03 5184
727 Hive Query Examples from test code (2 of 2) 총관리자 2014.03.26 5001
726 Spark에서 Serializable관련 오류및 조치사항 총관리자 2017.04.21 4901
725 [gson]mongodb의 api를 이용하여 데이타를 가져올때 "com.google.gson.stream.MalformedJsonException: Unterminated object at line..." 오류발생시 조치사항 총관리자 2017.12.11 4396
724 import 혹은 export할때 hive파일의 default 구분자는 --input-fields-terminated-by "x01"와 같이 지정해야함 총관리자 2014.05.20 4244
723 checking for termcap functions library... configure: error: No curses/termcap library found 구퍼 2013.03.08 4120
722 sqoop작업시 hdfs의 개수보다 더많은 값이 중복되어 oracle에 입력되는 경우가 있음 총관리자 2014.09.02 4093
721 다수의 로그 에이전트로 부터 로그를 받아 각각의 파일로 저장하는 방법(interceptor및 multiplexing) 총관리자 2014.04.04 4089
720 .git폴더를 삭제하고 다시 git에 추가하고 서버에 반영하는 방법 총관리자 2017.06.19 4077

A personal place to organize information learned during the development of such Hadoop, Hive, Hbase, Semantic IoT, etc.
We are open to the required minutes. Please send inquiries to gooper@gooper.com.

위로