02. PySpark 개발 환경 구축 - YBIGTA/EngineeringTeam GitHub Wiki

개요

  • 이 문서는 AWS EC2 서버 1대에 PySpark을 이용해 개발하기 위한 개발 환경 구축 과정을 담은 문서입니다.
  • 자세한 설명은 생략하고 최대한 명령어 위주로 담았습니다.
  • EC2 운영체제의 버전은 Ubuntu Server 18.04 LTS입니다.
  • 스토리지 볼륨은 40GB 정도 수준으로 맞춰주세요. 너무 적으면 설치가 완료되지 않을 수 있습니다.
  • 이 문서는 Getting Spark, Python, and Jupyter Notebook running on Amazon EC2를 참고하여 작성되었습니다.

설치할 소프트웨어

  • Anaconda for Python3
  • Java
  • Scala
  • Apache Hadoop
  • Apache Spark
  • Apache Hive

설치

다음의 단계로 나누어 설치를 진행한다. 01.PySpark 실습 환경 구축, Python 개발 환경 구축에 이어 진행한다.

  1. AWS 가입 & EC2 인스턴스 생성
  2. SSH를 이용해 EC2 인스턴스에 접속
  3. 기본 셋팅
  4. Python 환경 구성
  5. Java 설치
  6. Scala 설치
  7. Hadoop 설치
  8. Spark 설치
  9. Hive 설치

5. Java 설치

# Download JDK8 and install
$ cd $HOME
$ sudo apt-get install openjdk-8-jdk
# Yes를 입력하고 설치를 진행합니다. 시간이 약간 걸려요~

# ~/.bash_profile 수정
$ vi ~/.bash_profile

완성된 ~/.bash_profile의 내용은 아래와 같습니다. 자바의 환경 변수를 추가해 줍니다.

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# Anaconda
export ANACONDA_HOME="/home/ubuntu/anaconda3"

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

# Path
export PATH=${ANACONDA_HOME}/bin:${JAVA_HOME}/bin:$PATH

환경 변수를 적용해 줍니다. bash_profile의 내용을 변경한 후에는 항상 다음 명령을 수행해야 합니다.

$ source ~/.bash_profile

6. Scala 설치

# Download scala and install
# Y를 입력하여 설치를 진행합니다.
$ sudo apt-get install scala

7. Hadoop 설치

하둡을 Pseudo-Distributed 모드로 설치합니다.

7-1. 프로토콜 버퍼 설치

# Install gcc(C complier), g++(C++ complier), make(GNU make utility to maintain groups of programs)
# Y를 입력하여 설치를 진행합니다.
# 이 과정은 시간이 좀 걸려요~
$ sudo apt-get install gcc
$ sudo apt-get install g++
$ sudo apt-get install make

# Install profobuf
$ cd /usr/local
$ sudo wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
$ sudo tar xvzf protobuf-2.6.1.tar.gz
$ cd protobuf-2.6.1

# 시간이 조금 더(많이) 걸려요..!
$ sudo ./configure
$ sudo make
$ sudo make install
$ sudo ldconfig

$ protoc --version
# libprotoc 2.6.1

7-2. 하둡 설치

# Download and install Hadoop - ver. 2.9.0
$ cd $HOME
$ wget https://archive.apache.org/dist/hadoop/core/hadoop-2.9.0/hadoop-2.9.0.tar.gz
$ tar xvzf hadoop-2.9.0.tar.gz

# Make symbolic link for hadoop
$ ln -s hadoop-2.9.0 hadoop

# 설치 파일을 다운로드 폴더로 이동합니다
$ mv hadoop-2.9.0.tar.gz ./downloads/

7-3. 하둡 설정

앞서 사용했던 vim을 이용해 파일들을 수정해 주시면 됩니다.

# 하둡 설정파일이 있는 경로로 이동합니다

$ cd $HOME/hadoop/etc/hadoop
  1. hadoop-env.sh 수정
# 아래의 부분을 찾아 다음과 같이 수정합니다.

# 서버에 JAVA가 있는 위치를 설정합니다. 본인이 설치한 경로에 따라 아래의 경로와 다를 수 있습니다.
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

...

export HADOOP_PID_DIR=/home/ubuntu/hadoop/pids
  1. masters & slaves 수정 masters, slaves 파일의 내용이 다음과 같도록 수정합니다.

    아마 masters는 새로 만들어야 하고 slaves 이미 아래와 같이 되어있을 것입니다.

localhost
  1. core-site.xml 수정
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9010</value>
  </property>
</configuration>
  1. hdfs-site.xml 수정
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/ubuntu/data/dfs/namenode</value>
  </property>
  <property>
    <name>dfs.namenode.checkpoint.dir</name>
    <value>/home/ubuntu/data/dfs/namesecondary</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/ubuntu/data/dfs/datanode</value>
  </property>
  <property>
    <name>dfs.http.address</name>
    <value>localhost:50070</value>
  </property>
  <property>
    <name>dfs.secondary.http.address</name>
    <value>localhost:50090</value>
  </property>
</configuration>
  1. mapred-site.xml 수정

mapred-site.xml이 없으므로 먼저 mapred-site.xml.template을 복사해준다.

$ cp mapred-site.xml.template mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>
  1. yarn-site.xml 수정
<?xml version="1.0"?>

<configuration>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>localhost</value>
  </property>
  <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.nodemanager.local-dirs</name>
    <value>/home/ubuntu/data/yarn/nm-local-dir</value>
  </property>
  <property>
    <name>yarn.resourcemanager.fs.state-store.uri</name>
    <value>/home/ubuntu/data/yarn/system/rmstore</value>
  </property>
</configuration>
  1. bash_profile 수정

    vim ~/.bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# Anaconda
export ANACONDA_HOME="/home/ubuntu/anaconda3"

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

# Hadoop
export HADOOP_HOME="/home/ubuntu/hadoop"

# Path
export PATH=${ANACONDA_HOME}/bin:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:$PATH

환경 변수를 적용해 줍니다. bash_profile의 내용을 변경한 후에는 항상 다음 명령을 수행해야 합니다.

$ source ~/.bash_profile

7-4. SSH 설정

하둡에서는 데몬을 실행하기 위해 ssh로 접속할 수 있어야 합니다.

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

# 아래와 같이 입력해 localhost에 접속할 수 있는지 확인합니다(yes 입력)
$ ssh localhost

# localhost를 종료합니다
$ exit

7-5. 하둡 실행

$ cd $HADOOP_HOME

# Namenode format
$ ./bin/hdfs namenode -format

# 데몬의 시작
$ ./sbin/start-dfs.sh
$ ./sbin/start-yarn.sh

# 데몬이 정상적으로 시작되었을 때 실행된 프로세스의 예
$ jps

30817 Jps
30518 NodeManager
29898 DataNode
30092 SecondaryNameNode
30269 ResourceManager
29743 NameNode

# 데몬의 중지
$ ./sbin/stop-yarn.sh
$ ./sbin/stop-dfs.sh

8. Spark 설치

스파크를 설치합니다.

8-1. py4j 설치

$ cd $HOME
# pip 설치
# 이때 pip upgrade를 할 것인지 물어봅니다. no를 입력해야 합니다!
# yes를 하면 python 버전이 바뀌어 pyspark를 쓸 수 없습니다.(2020/9 기준)
$ conda install pip

# pip 설치 확인
$ which pip
# pip 버전 확인
$ pip --version
# pip 19.2.3 from /home/ubuntu/anaconda3/lib/python3.7/site-packages/pip (python 3.7)


# py4j 설치
$ pip install py4j

8-2. spark 설치

$ cd $HOME

# Download Spark and install - ver. 2.4.7(2020/09/12 release)
$ wget http://apache.mirror.cdnetworks.com/spark/spark-2.4.7/spark-2.4.7-bin-hadoop2.7.tgz

$ tar xvzf spark-2.4.7-bin-hadoop2.7.tgz

# Make symbolic link for spark
$ ln -s spark-2.4.7-bin-hadoop2.7 spark

# 설치 파일을 다운로드 폴더로 이동합니다
mv spark-2.4.7-bin-hadoop2.7.tgz ./downloads/

8-3. spark 설정

아까와 마찬가지로 spark도 설정을 수정해 줍시다. 같은 방법으로 하시면 됩니다.

  1. spark-env.sh 수정
$ cd $HOME/spark/conf

# spark-env.sh.template을 복사하여 spark-env.sh 생성
$ cp spark-env.sh.template spark-env.sh


# 수정 내용, 아래의 내용을 spark-env.sh 에 덧붙여 줍니다.
export SPARK_MASTER_WEBUI_PORT=9090
export SPARK_WORKER_WEBUI_PORT=9091
export HADOOP_CONF_DIR=/home/ubuntu/hadoop/etc/hadoop
  1. bash_profile 수정
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# Anaconda
export ANACONDA_HOME="/home/ubuntu/anaconda3"

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

# Hadoop
export HADOOP_HOME="/home/ubuntu/hadoop"

# Spark
export SPARK_HOME="/home/ubuntu/spark"

# PySpark
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

# Path
export PATH=${ANACONDA_HOME}/bin:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${SPARK_HOME}/bin:$PATH

환경 변수를 적용해 줍니다. bash_profile의 내용을 변경한 후에는 항상 다음 명령을 수행해야 합니다.

$ source ~/.bash_profile

9. Hive 설치

9-1. Hive 설치

아파치 더비를 이용해 Hive 환경을 구축합니다.

$ cd $HOME

# Download and install hive - ver. 2.3.4
$ wget https://archive.apache.org/dist/hive/hive-2.3.4/apache-hive-2.3.4-bin.tar.gz
$ tar xvzf apache-hive-2.3.4-bin.tar.gz

# Make symbolic link for hive
$ ln -s apache-hive-2.3.4-bin hive

# 설치 파일을 다운로드 폴더로 이동합니다
$ mv apache-hive-2.3.4-bin.tar.gz ./downloads/

9-2. Hive 설정

$ cd $HOME
$ cd hive/conf
$ cp hive-env.sh.template hive-env.sh
$ vim hive-env.sh

hive-env.sh 에 다음과 같이 추가합니다.

HADOOP_HOME=/home/ubuntu/hadoop

hive-site.xml 이 존재하지 않기 때문에 만들고 아래와 같은 내용을 넣어줍니다.

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse/</value> 
  </property>
  <property>
    <name>hive.cli.print.header</name>
    <value>true</value>
  </property>
  <property>
      <name>hive.metastore.uris</name>
      <value>thrift://localhost:9083</value>
  </property>
  <property>
      <name>hive.metastore.schema.verification</name>
      <value>false</value>
  </property>
</configuration>

9-3. Hive 실행

# Hadoop 실행
$ $HADOOP_HOME/sbin/start-dfs.sh
$ $HADOOP_HOME/sbin/start-yarn.sh

# HDFS 디렉토리 생성/권한 부여
$ hdfs dfs -mkdir -p /tmp/hive
$ hdfs dfs -mkdir -p /user/hive/warehouse
$ hdfs dfs -chmod g+w /tmp
$ hdfs dfs -chmod 777 /tmp/hive
$ hdfs dfs -chmod g+w /user/hive
$ hdfs dfs -chmod g+w /user/hive/warehouse

# hive 메타스토어 초기화
$ cd $HOME/hive
$ ./bin/schematool -initSchema -dbType derby

9-4. Hive 설정파일 Spark conf로 복사

# Hive 설정 파일을 spark/conf로 복사
$ cp $HOME/hive/conf/hive-site.xml $HOME/spark/conf/

9-5. Hive metastore 실행

$ ./bin/hive --service metastore&
# 명령어 맨 뒤에 &를 붙이면 백그라운드로 실행됩니다.
# SLF4J ~ 까지 출력되면 엔터를 눌러 빠져나옵니다. 

# 정상적으로 시작되었을 때 실행된 프로세스의 예
$ jps

20273 NameNode
21316 RunJar
20436 DataNode
20807 ResourceManager
20956 NodeManager
21406 Jps
20639 SecondaryNameNode

10. PySpark 동작 확인

$ cd $HOME

# pyspark 실행
$ pyspark

각자의 ec2 주소로 jupyter에 접속합니다. http가 아닌 https임에 유의합니다.

https://${ec2-ip-address}:10001

새로운 jupyter notebook 파일을 만든 뒤 sc를 입력합니다. sc는 SparkContext의 약자입니다. 다음과 비슷한 결과가 나오면 성공입니다.

SparkContext
Spark UI
Version
v2.4.6
Master
local[*]
AppName
PySparkShell
⚠️ **GitHub.com Fallback** ⚠️