본문 바로가기

Cloud, Bigdata, AI/Big Data Analysis

[Bigdata] Hadoop, Spark, Zeppelin 연동 시스템 구축

반응형

요즘 빅데이터를 공부할 때 Hadoop, Spark, Zeppelin을 사용하고 있다.

Hadoop은 HDFS로써 데이터 저장소의 역할을 하고, Spark는 분석 엔진의 역할, Zeppelin은 인터페이스의 역할을 한다.

이들을 하나의 서버에서 연동하여 사용하는 시스템을 구축하는 방법을 정리해보고자 한다.

 

0. Prerequisite

0.1 Ubuntu

우분투는 16.04.5 LTS 버전을 사용하였다. 18 버전이 불안정하다는 다수의 의견이 있어 16 버전을 선택하였다.

 

0.2 Physical FileSystem structure

ubuntu는 UEFI 모드로 설치하였고, 파일시스템은 btrfs 를 사용하였다.

사용할 서버는 SSD 256G, HDD 1TBx2의 저장공간을 가지고 있어서

SSD는 /에 마운트하고,  HDD1은  /media/user/dw에 마운트하였다. HDD2는 시스템 백업용으로 사용한다.

SSD에는 OS와 hadoop, spark, zeppelin 등 시스템 전체가 위치하며, SSD의 빠른 접근속도로 퍼포먼스를 확보한다.

빅데이터의 물리적 저장소는 HDD1에 위치하도록 구성한다.

 

0.3 java

oracle java를 설치하되, apt-get으로 설치하지 않고 tar을 직접 설치한다.

아래 링크 페이지에서 'Accept ...' 버튼 클릭하고 Linux x64 --.tar.gz 를 클릭하여 다운받는다.

 

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

 

Java SE Development Kit 8 - Downloads

Java SE Development Kit 8 Downloads Thank you for downloading this release of the Java™ Platform, Standard Edition Development Kit (JDK™). The JDK is a development environment for building applications, applets, and components using the Java programming la

www.oracle.com

최근에 오라클 java를 설치하려면 오라클에 로그인을 해야하므로 다운로드 버튼 클릭후 뜨는 로그인 창에서 로그인 하면 다운이 시작된다.

 

다운받은 파일의 압축을 풀어준다.

그리고 모든 애플리케이션은 /home/user/apps 아래에 설치할 예정이므로 압축 푼 디렉토리를 apps 아래에 위치시킨 후 심볼릭 링크를 걸어준다.

$ tar xvzf ./Downloads/jdk-8u181-linux-x64.tar.gz
$ mv ./jdk1.8.0_181 ~/apps/
$ cd ~/apps
$ ln -s ./jdk1.8.0_181 java

 

그리고 아래와 같이 환경변수를 등록한다.

$ vi ~/.bashrc
export JAVA_HOME=/home/user/apps/java
export PATH=$PATH:$JAVA_HOME/bin
$ source ~/.bashrc

 

1. Hadoop (Pseudo-distributed mode)

1.1 다운로드 및 설치

http://mirror.navercorp.com/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz

 

이번 포스팅에서는 2.8.5 버전을 사용한다. 향후 다른 하둡 에코시스템과의 호환성을 위해 2 버전을 선택하였다.

다운이 완료되었으면 압축을 푼다.

압축 푼 디렉토리를 apps에 위치시킨 후 심볼릭 링크를 걸어준다. 환경변수도 등록한다.

== 추가 : HADOOP_HOME아래 bin만 추가하지 말고 sbin도 추가해야한다.

$ tar xvzf ./Downloads/hadoop-2.8.5.tar.gz
$ mv ./hadoop-2.8.5 ~/apps/
$ cd ~/apps
$ ln -s ./hadoop-2.8.5 hadoop
$ vi ~/.bashrc
    export HADOOP_HOME=/home/user/apps/hadoop
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
$ source ~/.bashrc

 

1.2 hadoop conf

의사분산모드에서는 아래의 파일들을 수정해주면 된다. (참고 : link)

# etc/hadoop/hadoop-env.sh
(... 파일 내용 하단에 추가)
export JAVA_HOME=/home/user/apps/java
<!-- etc/hadoop/core-site.xml -->

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>


<!-- etc/hadoop/hdfs-site.xml -->

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/media/user/dw/hdfs/name</value>
    </property>

    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/media/user/dw/hdfs/data</value>
    </property>
</configuration>


<!-- etc/hadoop/mapred-site.xml -->

<configuration>
    <property>
        <name>map.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>


<!-- etc/hadoop/yarn-site.xml -->

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

 

hdfs-site.xml의 property중 dfs.namenode... , dfs.datanode 는 hdfs의 물리적 저장소를 hdd에 위치시키기 위해서 /home 하위 디렉토리가 아닌 곳에 경로를 잡아준 것이다. 따라서 해당 경로에 디렉토리를 생성하여야 한다. 그리고 권한설정을 해준다.

$ mkdir /media/user/dw/hdfs/
$ mkdir /media/user/dw/hdfs/name
$ mkdir /media/user/dw/hdfs/data
$ chown -R user:user /media/user/dw/hdfs

 

1.3 ssh 설정

ssh 설정의 목적은 하둡, 스파크, 제플린이 자기자신 host로 ssh접속할 때 비밀번호 입력없이 자동로그인을 수행하여 실행에 문제가 없도록 하기 위함이다.

아래 세가지 host에 ssh 연결을 시도해보자. 모두 자기 자신의 루프백 host인데 명칭과 용도가 조금 다른 것 뿐이다.

모든 노드의 host 접속 연결을 등록해야했던 완전분산모드와 달리, 의사분산모드는 자기 자신에 대한 ssh connection만 사용하므로 아래 세 개만 known_hosts에 등록하면 된다.

$ ssh localhost
$ ssh 127.0.0.1
$ ssh 0.0.0.0

다만, 이 세가지 접속을 수행할 때 ssh localhost로 접속한 뒤 exit를 하고, 그 다음 ssh 127.0.0.1 접속 후 exit 해주고 마지막 ssh 0.0.0.0으로 해주어야 한다.

 

이제 ssh 키를 생성하여 자동 인증을 걸어준다.

$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

이렇게 한 뒤 hadoop의 start-dfs.sh과 start-yarn.sh 실행시 패스워드를 묻지 않으면 잘 설정된 것이고,

만약 패스워드를 묻는다면, ~/.ssh의 모든 파일을 지우고 1.3 과정을 다시 수행해보자.

 

1.4 실행 테스트

하둡 데몬을 실행하기 전에 namenode를 포맷해야 한다.

$ hdfs namenode -format

 

이제 본격적으로 실행해보자.

$ start-dfs.sh
$ start-yarn.sh
$ jps

자바 프로세스 명령을 실행하여 NameNode, DataNode, SecondaryNameNode, NodeManager, ResourceManager 가 뜬다면 하둡 데몬이 정상적으로 실행된 것이다.

$ hdfs dfs -mkdir /sqoop
$ hdfs dfs -ls /

 

hdfs에 디렉토리를 생성한 후 ls 명령으로 확인해서 잘 나온다면 정상작동하고 있는 것이다.

만약 위 하둡 명령중 하나라도 정상작동하지 않는다면 ./logs에 있는 .log 파일을 열어 ERROR 태그에 해당하는 로그를 보고 원인을 찾아야한다.

namenode의 오류인지, datanode의 오류인지, 아니면 다른 프로세스의 오류인지도 확인해야 한다.

 

 

2. Spark

2.1 다운로드 및 설치

http://apache.mirror.cdnetworks.com/spark/spark-2.2.2/spark-2.2.2-bin-hadoop2.7.tgz

 

http://archive.apache.org/dist/spark/spark-2.2.2/spark-2.2.2-bin-hadoop2.7.tgz

 

이번 포스팅에서는 spark 2.2.2 버전을 사용한다. zeppelin 0.8.0과의 호환성을 위해 2.3이 아닌 2.2 버전을 선택하였다.

다운이 완료되었으면 하둡 설치와 같은 과정을 거쳐 PATH까지 등록 완료한다.

== 추가 : hadoop과 마찬가지로 spark역시 SPARK_HOME 아래 bin과 sbin 모두 PATH에 추가해주어야한다.

$ tar xvzf ./Downloads/spark-2.2.2-bin-hadoop2.7.tgz
$ mv ./spark-2.2.2-bin-hadoop2.7 ~/apps/
$ cd ~/apps
$ ln -s ./spark-2.2.2-bin-hadoop2.7 spark
$ vi ~/.bashrc
    export SPARK_HOME=/home/user/apps/spark
    export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
$ source ~/.bashrc

2.2 spark/conf

spark는 성능 향상을 위해 executor와 driver memory 등의 세부 설정을 할 수 있는데 서버의 사양에 따라 달라질 수 있으므로 기본값으로 사용하는 것을 추천한다.

 

2.2.1 구성 설정 (필수사항)

# conf/spark-env.sh

(... 파일 내용 하단에 추가)
export JAVA_HOME=/home/user/apps/java
export HADOOP_HOME=/home/witlab/apps/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
export SPARK_LOCAL_IP="xxx.xxx.xxx.xxx"  # your local ip
export PYSPARK_PYTHON=/usr/bin/python3
export PYSPARK_DRIVER_PYTHON=/usr/bin/python3
export SPARK_MASTER_HOST=localhost


# conf/spark-defaults.conf
(...)
spark.master                     spark://localhost:7077
(...)

 

2.2.2 spark 성능 향상 (선택사항, 절대적인 설정이 아님!) (참고 : link)

# spark-defaults.conf

(... 파일 내용 하단에 추가)
spark.executor.instances=1
spark.executor.cores=3
spark.executor.memory=4g
spark.driver.cores=1
spark.driver.memory=4g

 

2.3 실행 테스트

$ start-master.sh
$ start-slaves.sh

 

jps를 사용하여 잘 동작하는 지 확인해보자.

Master 노드와 Worker 노드가 동작하고 있다면 정상 작동하는 것이다.

 

3. Zeppelin

3.1 다운로드 및 설치

http://apache.tt.co.kr/zeppelin/zeppelin-0.8.0/zeppelin-0.8.0-bin-all.tgz

 

zeppelin은 최신 버전인 0.8.0 버전을 사용한다.

다운이 완료되었으면 하둡 설치와 같이 아래 설치 과정을 거친다.

$ tar xvzf ./Downloads/zeppelin-0.8.0-bin-all.tgz
$ mv ./zeppelin-0.8.0-bin-all ~/apps/
$ cd ~/apps
$ ln -s ./zeppelin-0.8.0-bin-all zeppelin
$ vi ~/.bashrc
    export ZEPPELIN_HOME=/home/user/apps/zeppelin
    export PATH=$PATH:$ZEPPELIN_HOME/bin
$ source ~/.bashrc

 

3.2 zeppelin/conf

# conf/zeppelin-env.sh

export JAVA_HOME=/home/witlab/apps/java
export MASTER=spark://localhost:7077
export ZEPPELIN_MEM="-Xms1g -Xmx8g -XX:MaxPermSize=1g"
export ZEPPELIN_INTP_MEM="-Xms1g -Xmx8g -XX:MaxPermSize=1g"
export SPARK_HOME=/home/witlab/apps/spark
export HADOOP_CONF_DIR=/home/witlab/apps/hadoop/etc/hadoop
export PYSPARK_PYTHON=python3
export PYTHONPATH=python3
export ZEPPELIN_PORT=8888
<!-- conf/zeppelin-site.xml (해당하는 값만 수정) --> 

<property>
  <name>zeppelin.server.port</name>
  <value>8888</value>
  <description>Server port.</description>
</property> 

(...)

<property>
  <name>zeppelin.interpreter.output.limit</name>
  <value>1048576</value>
  <description>Output message from interpreter exceeding the limit will be truncated</description>
</property>

(...)

<property>
  <name>zeppelin.websocket.max.text.message.size</name>
  <value>1048576</value>
  <description>Size in characters of the maximum text message to be received by websocket. Defaults to 1024000</description>
</property>

(...)

 

 

3.3 계정 생성

Zeppelin 서버는 Apache Shiro라는 프로젝트의 보안 기법을 적용한다. shiro는 conf/shiro.ini의 설정내용을 읽어들인다.

zeppelin 사용자는 shiro.ini 파일의 [users] 섹션에 "id = password, roles" 형식으로 적게 되어있다.

roles는 해당 사용자의 역할인데, 이는 파일 내용 아래에 내려가보면 [roles] 섹션에서 정의할 수 있다.

그리고 [urls] 섹션의 맨 마지막에 "/** = authc" 줄을 주석 해제하고 "/** = anon"은 주석처리하자.

$ pwd
/home/witlab/apps/zeppelin/conf
$ cp shiro.ini.template shiro.ini
$ vi shiro.ini

# conf/shiro.ini

(...)

[users] # 원하는 계정명, 비밀번호 생성하기
#admin = password, admin
glow153 = jakepark, admin

(...)

[roles]
admin = *

(...)

[urls]

(...)

#/** = anon
/** = authc

[urls] 섹션에서는 role에 따라 접근을 다르게 줄 수 있는데 자세한 설정을 원하는 사람들은 좀 더 구글링해보자.

 

 

3.4 실행 테스트

zeppelin 서버를 실행해보자. zeppelin 서버는 zeppelin-daemon.sh에 인자로 "start"만 전달하여 실행하면 된다.

$ zeppelin-daemon.sh start

이와 반대로 끄는 것은 sh 인자에 "stop", 재부팅은 "reload"를 전달하여 실행하면 된다.

 

4. 전체 실행 테스트

4.1 빅데이터분석 서버 켜기

아래와 같은 순서대로 명령을 실행하면 된다.

$ vi start-bs.sh

    # start hadoop
    start-dfs.sh
    start-yarn.sh

    # start spark
    start-master.sh
    start-slaves.sh

    #start zeppelin
    zeppelin-daemon.sh start

 

4.2 빅데이터분석 서버 끄기

종료때에는 켜는 순서의 거꾸로 진행하면 된다

$ vi stop-bs.sh
    # stop zeppelin
    zeppelin-daemon.sh stop

    # stop spark
    stop-slaves.sh
    stop-master.sh

    # stop hadoop
    stop-yarn.sh
    stop-dfs.sh

 

이렇게 작성한 두개의 쉘스크립트를 PATH에 등록하면 명령줄로 사용할 수 있다.

나같은 경우 편의를 위해 작성한 쉘 스크립트를 따로 모아두는 디렉토리를 생성하고 그 안에 넣은 다음 해당 디렉토리를 PATH에 등록한다.

$ ls
apps       dw       Downloads     NIMS      start-bs.sh  workspace
derby.log  Desktop  metastore_db  raw_data  stop-bs.sh
$ mkdir .jsh
$ mv ./start-bs.sh ~/.jsh
$ mv ./stop-bs.sh ~/.jsh
$ cd .jsh
$ ls
start-bs.sh		stop-bs.sh
$ vi ~/.bashrc
	export PATH=$PATH:/home/user/.jsh
$ source ~/.bashrc

 

4.3 zeppelin 실행

이제 zeppelin을 본격적으로 실행해보자. 웹브라우저에 localhost:8888을 입력하면 다음과 같이 창이 뜬다.

 

우측상단 login 버튼을 눌러 shiro.ini에 설정한 계정과 비밀번호를 이용하여 로그인한다.

 

 

이제 노트북을 만들고 마음껏 사용하면 된다!

 

반응형