메뉴 건너뛰기

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

번호 제목 글쓴이 날짜 조회 수
130 [Impala] alter table구문수행시 "WARNINGS: Impala does not have READ_WRITE access to path 'hdfs://nameservice1/DATA/Temp/DB/source/table01_ccd'" 발생시 조치 gooper 2024.04.26 0
129 [CDP7.1.7, Hive Replication]Hive Replication진행중 "The following columns have types incompatible with the existing columns in their respective positions " 오류 gooper 2023.12.27 7
128 [CDP7.1.7]Oozie job에서 ERROR: Kudu error(s) reported, first error: Timed out: Failed to write batch of 774 ops to tablet 8003f9a064bf4be5890a178439b2ba91가 발생하면서 쿼리가 실패하는 경우 gooper 2024.01.05 7
127 [CDP7.1.7]impala-shell수행시 간헐적으로 "-k requires a valid kerberos ticket but no valid kerberos ticket found." 오류 gooper 2023.11.16 11
126 임시 테이블에서 데이터를 읽어서 partitioned table에 입력하는 impala SQL문 예시 gooper 2023.11.10 16
125 [impala]insert into db명.table명 select a, b from db명.table명 쿼리 수행시 "Memory limit exceeded: Failed to allocate memory for Parquet page index"오류 조치 방법 gooper 2023.05.31 22
124 not leader of this config: current role FOLLOWER 오류 발생시 확인방법 총관리자 2022.01.17 23
123 kudu table와 impala(hive) table정보가 틀어져서 테이블을 읽지 못하는 경우(Error Loading Metadata) 조치방법 gooper 2023.11.10 25
122 [CDP7.1.7]Impala Query의 Memory Spilled 양은 ScratchFileUsedBytes값을 누적해서 구할 수 있다. gooper 2022.07.29 29
121 [Cloudera 6.3.4, Kudu]]Service Monitor에서 사용하는 metric중에 일부를 blacklist로 설정하여 모니터링 정보 수집 제외하는 방법 gooper 2022.07.08 31
120 Failed to write to server: (no server available): 총관리자 2022.01.17 32
119 AnalysisException: Incomplatible return type 'DECIMAL(38,0)' and 'DECIMAL(38,5)' of exprs가 발생시 조치 총관리자 2021.07.26 34
118 spark에서 hive table을 읽어 출력하는 예제 소스 총관리자 2017.03.09 35
117 [TLS/SSL]Kudu Tablet Server설정 총관리자 2022.05.13 35
116 spark에서 hive table을 읽어 출력하는 예제 소스 총관리자 2017.03.09 37
115 [KUDU] kudu tablet server여러가지 원인에 의해서 corrupted상태가 된 경우 복구방법 gooper 2023.03.28 37
114 [CDP7.1.7]impala-shell을 이용하여 kudu table에 insert/update수행시 발생하는 오류(Transport endpoint is not connected (error 107)) 발생시 확인할 내용 gooper 2023.11.30 44
113 spark 온라인 책자링크 (제목 : mastering-apache-spark) 총관리자 2016.05.25 51
112 [hive] hive.tbls테이블의 owner컬럼값은 hadoop.security.auth_to_local에 의해서 filtering된다. 총관리자 2022.04.14 55
111 [Impala jdbc]CDP7.1.7환경에서 java프로그램을 이용하여 kerberized impala cluster에 접근하여 SQL을 수행하는 방법 gooper 2023.08.22 57

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.

위로