AWS 환경에서 하둡 스파크 클러스터를 구축하는 과정을 기록했다.

2편: https://tes-b.github.io/hadoop/spark/aws/hadoop_spark_on_ec2_2/
3편: https://tes-b.github.io/hadoop/spark/aws/hadoop_spark_on_ec2_3/

이 글은 빅공잼님의 ‘빅데이터 분석 환경 구축’ 영상을 보고
직접 설치해 보면서 제 환경에 맞춰 글로 옮긴 것이며
개인적인 기록용도로 작성하는 것이니 설명이 생략된 부분이 많다.
EC2와 우분투에 대해 조금은 알고 있어야 이해가 편할 것이다.

빅공잼님의 영상은 좀 더 자세한 설명이 있으니 보고 따라해도 된다.
https://youtube.com/playlist?list=PLJlUnZ1kDbt7X2C4ntIYHmphNDIc5wN8J

주의사항

나는 영상과 다르게 하둡, 스파크, 제플린 모두 최신버전으로 설치했는데
제플린과 스파크의 버전 충돌로 파이스파크 실행은 실패했다.
내 경우 주피터를 올려서 파이스파크를 사용했지만
제플린에서 파이스파크를 실행하려면 버전을 잘 확인해서 설치하거나
영상과 같은 버전을 설치하는게 좋다.

설치 버전

이 포스트 (제플린에서 파이스파크 실행 안됨)

  • Apache Hadoop 3.3.5
  • Apache Spark 3.4.0
  • Apache Zookeeper 3.8.1
  • Zeppelin 0.10.1

원본 영상

  • Apache Hadoop 3.2.3
  • Apache Spark 3.2.1
  • Apache Zookeeper 3.8.0
  • Zeppelin 0.10.1

인스턴스 생성

EC2 인스턴스를 생성한다.
인스턴스 1개만 생성한뒤 필요한 설치를 진행하고
AMI를 만들어 4개를 추가로 복제한 뒤 각각 필요한 세팅을 진행할 것이다.

EC2 세팅

  • 운영체제 : ubuntu 20.04 LTS
  • 인스턴스 타입 : t2.xlarge
  • 스토리지 : 30gb

주의할 점

처음에는 t2.micro 인스턴스를 선택해 진행했으나
실행되는 프로세스가 많아 서버가 터지는 일이 발생했다.
원활한 진행을 위해서는 t2.large 이상의 인스턴스로 진행하는 것을 추천한다.

ssh keygen

로컬에서 ssh로 서버에 접속할 것이다.
ssh 키를 생성한다.

ssh-keygen -t rsa


질문이 3가지가 나오는데 나오면 그냥 엔터를 쳐서 기본 값으로 생성한다.
생성되는 경로는 ~/.ssh/이다.

그다음 config파일을 만들고

vim ~/.ssh/config

다음을 추가한다.

# ~/.ssh/config >

Host nn1
	HostName <네임노드의 퍼블릭 아이피>
	User ubuntu
	IdentityFile <pem 파일 경로>

저장하고 접속 테스트를 해본다.

ssh nn1

아래 질문에는 yes를 입력하면 된다.

Are you sure you want to continue connecting (yes/no/[fingerprint])?

접속이 된다면 잘 설정이 된 것이다.

자바 설치

hadoop, yarn, spark, zookeeper는 자바에서 동작하기 때문에 설치가 필요하다.

sudo apt-get -y update
sudo apt-get -y dist-upgrade # 신규 패키지 업그레이드

필요 라이브러리 설치

sudo apt-get install -y vim wget unzip ssh openssh-* net-tools

자바 설치

sudo apt-get install -y openjdk-8-jdk

자바 설치된 경로

/usr/lib/jvm/java-8-openjdk-amd64

환경변수 설정

sudo vim /etc/environment

PATH 맨 뒤에 구분자 :를 넣고
/usr/lib/jvm/java-8-openjdk-amd64 를 추가하고
아래에 JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"를 추가한다.

# /etc/environment >

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/java-8-openjdk-amd64/bin"

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

활성화

source /etc/environment

.bashrcJAVA_HOME추가

sudo echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' >> ~/.bashrc

활성화

source ~/.bashrc

하둡 설치

경로생성 및 이동

sudo mkdir /install_dir && cd /install_dir

다운로드 받은 파일들을 전부 여기에 모을 예정이다.

파일 다운로드

https://hadoop.apache.org/
하둡 홈페이지에 가서 원하는 버전의 링크를 가져오자

wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.5/hadoop-3.3.5.tar.gz

압축풀기

-C 명령어를 이용해 /usr/local/ 경로에 압축을 푼다.

이 포스트는 /usr/local/경로를 기준으로 작성되었으나
원한다면 다른 경로에 해도 상관없다.

sudo tar -zxvf hadoop-3.3.5.tar.gz -C /usr/local

폴더명 수정

매번 hadoop-3.3.5이렇게 쓰기 귀찮기 때문에 편의상 바꾸는 것이고 필수는 아니다.
이 포스트는 폴더명을 바꾸는 것을 기준으로 작성되었으나
원한다면 그대로 써도 상관없다.

sudo mv /usr/local/hadoop-3.3.5 /usr/local/hadoop

환경변수 설정

자바 설치때 처럼 환경변수를 설정한다.
PATH 뒤에 :/usr/local/hadoop/bin:/usr/local/hadoop/sbin 두가지를 추가하고
HADOOP_HOME="/usr/local/hadoop" 도 추가한다.

sudo vim /etc/environment
# /etc/environment >

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/java-8-openjdk-amd64/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin"

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
HADOOP_HOME="/usr/local/hadoop"                  

활성화

source /etc/environment

사용자 환경변수 설정

환경변수 추가 ~/.bashrc에 변수를 추가한다.

sudo echo 'export HADOOP_HOME=/usr/local/hadoop' >> ~/.bashrc
sudo echo 'export HADOOP_COMMON_HOME=$HADOOP_HOME' >> ~/.bashrc
sudo echo 'export HADOOP_HDFS_HOME=$HADOOP_HOME' >> ~/.bashrc
sudo echo 'export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop' >> ~/.bashrc
sudo echo 'export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop' >> ~/.bashrc
sudo echo 'export HADOOP_YARN_HOME=$HADOOP_HOME' >> ~/.bashrc
sudo echo 'export HADOOP_MAPRED_HOME=$HADOOP_HOME' >> ~/.bashrc

활성화

source ~/.bashrc

적용 확인

env | grep HADOOP

hdfs-site.xml 수정

sudo vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
# $HADOOP_HOME/etc/hadoop/hdfs-site.xml >

<configuration>
    <!-- configuration hadoop -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/usr/local/hadoop/data/nameNode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/hadoop/data/dataNode</value>
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/usr/local/hadoop/data/dfs/journalnode</value>
    </property>
    <property>
        <name>dfs.nameservices</name>
        <value>my-hadoop-cluster</value>
    </property>
    <property>
        <name>dfs.ha.namenodes.my-hadoop-cluster</name>
        <value>namenode1,namenode2</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode1</name>
        <value>nn1:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode2</name>
        <value>nn2:8020</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.my-hadoop-cluster.namenode1</name>
        <value>nn1:50070</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.my-hadoop-cluster.namenode2</name>
        <value>nn2:50070</value>
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://nn1:8485;nn2:8485;dn1:8485/my-hadoop-cluster</value>
    </property>
    <property>
        <name>dfs.client.failover.proxy.provider.my-hadoop-cluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>shell(/bin/true)</value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/ubuntu/.ssh/id_rsa</value>
    </property>
    <property> 
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.name.dir</name>
        <value>/usr/local/hadoop/data/name</value>
    </property>
    <property>
        <name>dfs.data.dir</name>
        <value>/usr/local/hadoop/data/data</value>
    </property>
</configuration>


core-site.xml 수정

sudo vim $HADOOP_HOME/etc/hadoop/core-site.xml
# $HADOOP_HOME/etc/hadoop/core-site.xml >

<configuration>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://nn1:9000</value>
        </property>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://my-hadoop-cluster</value>
        </property>
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>nn1:2181,nn2:2181,dn1:2181</value>
        </property>
</configuration>


yarn-site.xml 수정

sudo vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
# $HADOOP_HOME/etc/hadoop/yarn-site.xml >

<configuration>
        <!-- Site specific YARN configuration properties -->
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
                <value>org.apache.hadoop.mapred.ShuffleHandler</value>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>nn1</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
</configuration>


mapred-stie.xml 수정

sudo vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
# $HADOOP_HOME/etc/hadoop/mapred-site.xml >

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>yarn.app.mapreduce.am.env</name>
                <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
        <property>
                <name>mapreduce.map.env</name>
                <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
        <property>
                <name>mapreduce.reduce.env</name>
                <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
</configuration>


hadoop-env.sh 수정

sudo vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh

아래에 다음 내용을 추가한다.

# $HADOOP_HOME/etc/hadoop/hadoop-env.sh >


# Java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

# Hadoop
export HADOOP_HOME=/usr/local/hadoop


worker master 설정

워커를 설정한다.

sudo vim $HADOOP_HOME/etc/hadoop/workers

localhost 를 주석처리 하고 아래와 같이 작성

# $HADOOP_HOME/etc/hadoop/workers >

# localhost
dn1
dn2
dn3

마스터를 설정한다.

sudo vim $HADOOP_HOME/etc/hadoop/master
# $HADOOP_HOME/etc/hadoop/master >

nn1
nn2

소유권 설정

sudo chown -R $USER:$USER /usr/local/hadoop/

처음엔 소유권 설정을 하지않고 진행했었는데
이후 하둡 파일 시스템 포맷시 진행이 안되는 문제가 있었음

스파크 설치

다운로드 경로로 이동

cd /install_dir

다운로드

sudo wget https://dlcdn.apache.org/spark/spark-3.4.0/spark-3.4.0-bin-hadoop3.tgz

압축풀기

sudo tar -xzvf spark-3.4.0-bin-hadoop3.tgz -C /usr/local

폴더명 수정

sudo mv /usr/local/spark-3.4.0-bin-hadoop3 /usr/local/spark


라이브러리 설치

파이썬 설치

sudo apt-get install -y python3-pip

파이스파크, 파인드스파크 설치

sudo pip3 install pyspark findspark


환경변수 설정

sudo vim /etc/environment

PATH 뒤에 :/usr/local/spark/bin:/usr/local/spark/sbin 두가지를 추가하고
SPARK_HOME="/usr/local/spark" 도 추가한다.

# /etc/environment >

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/java-8-openjdk-amd64/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin"

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
HADOOP_HOME="/usr/local/hadoop"
SPARK_HOME="/usr/local/spark"

활성화

source /etc/environment

사용자 환경변수 추가

echo 'export SPARK_HOME=/usr/local/spark' >> ~/.bashrc

활성화

source ~/.bashrc

적용 확인

env | grep SPARK


환경설정 파일 작성

스파크 conf 경로로 이동

cd $SPARK_HOME/conf

스파크는 스크립트 파일들의 템플릿이 있어
원하는 파일을 복사해서 사용하면 된다.

spark-env.sh 파일 작성

sudo cp spark-env.sh.template spark-env.sh
sudo vim spark-env.sh

아래에 추가

# $SPARK_HOME/conf/spark-env.sh >

export SPARK_HOME=/usr/local/spark
export SPARK_CONF_DIR=/usr/local/spark/conf
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export SPARK_MASTER_WEBUI_PORT=18080

spark-defaults.conf 파일 작성

sudo cp spark-defaults.conf.template spark-defaults.conf
sudo vim spark-defaults.conf

아래에 추가

# $SPARK_HOME/conf/spark-defaults.conf >

spark.master            yarn
spark.eventLog.enabled  true
spark.eventLog.dir      /usr/local/spark/logs

로그 디렉토리 생성

sudo mkdir -p /usr/local/spark/logs

로그 디렉토리 소유권 수정

sudo chown -R $USER:$USER /usr/local/spark/

workers 파일 편집

cd /usr/local/spark/conf
sudo cp workers.template workers
sudo vim workers

localhost를 주석하고 아래 내용 추가

# /usr/local/spark/conf/workers >

# localhost
dn1
dn2
dn3

파이썬 환경설정

sudo vim /etc/environment

PATH뒤에 /usr/bin/python3추가

# /etc/environment >

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/java-8-openjdk-amd64/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/bin/python3"

활성화

source /etc/environment

사용자 환경변수 추가

sudo echo 'export PYTHONPATH=/usr/bin/python3' >> ~/.bashrc
sudo echo 'export PYSPARK_PYTHON=/usr/bin/python3' >> ~/.bashrc

활성화

source ~./bashrc

적용 확인

env | grep PYTHON


주키퍼 설치

다운로드 경로 이동

cd /install_dir

다운로드

sudo wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz

압축풀기

sudo tar -xzvf apache-zookeeper-3.8.1-bin.tar.gz -C /usr/local

폴더명 수정

sudo mv /usr/local/apache-zookeeper-3.8.1-bin /usr/local/zookeeper

환경변수 설정

sudo vim /etc/environment
# /etc/environment >

ZOOKEEPER_HOME="/usr/local/zookeeper"

활성화

source /etc/environment

유저 환경변수 추가

echo 'export ZOOKEEPER_HOME=/usr/local/zookeeper' >> ~/.bashrc

활성화

source ~/.bashrc

적용 확인

env | grep ZOOKEEPER


주키퍼 환경 설정

주키퍼 경로로 이동

cd $ZOOKEEPER_HOME

zoo.cfg 파일 생성

sudo cp ./conf/zoo_sample.cfg ./conf/zoo.cfg

편집

sudo vim ./conf/zoo.cfg

dataDir 주석처리 하고 새 경로 설정.
dataLogDir 및 기타 설정값 추가

# ./conf/zoo.cfg >

# dataDir=/tmp/zookeeper
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs

maxClientCnxns=0
maxSessionTimeout=180000
server.1=nn1:2888:3888
server.2=nn2:2888:3888
server.3=dn1:2888:3888

dataLogDir추가 한 디렉토리 생성

sudo mkdir -p /usr/local/zookeeper/data
sudo mkdir -p /usr/local/zookeeper/logs

소유권 변경

sudo chown -R $USER:$USER /usr/local/zookeeper

myid를 생성 하고 내용은 1을 넣어준다.

sudo vim /usr/local/zookeeper/data/myid
# /usr/local/zookeeper/data/myid >

1


ssh 키 생성

ssh-keygen -t rsa

다음 나오는 질문3 가지는 전부 엔터친다.

Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 

생성 확인

ls -al ~/.ssh

Image0

인증키 추가

cat >> ~/.ssh/authorized_keys < ~/.ssh/id_rsa.pub

접속 확인

ssh localhost


2편에서 계속

여기까지 진행하면 기본 세팅을 끝났다.
이제 이 인스턴스를 AMI로 이미지를 만들어 복사한뒤
각각의 인스턴스에 필요한 설정을 해 주면 된다.

이미지를 만들고 각 세팅을 하는 방법은 2편에서 이어 진행한다.

2편: https://tes-b.github.io/hadoop/spark/aws/hadoop_spark_on_ec2_2/

Leave a comment