1. Installation

1.1 Install Dependencies

$ pip install pyspark[all]
$ sudo apt-get install openjdk-8-jdk
$ java -version

1.2 Install Hadoop

하둡 다운로드 페이지에 접속해서 하둡 바이너리를 다운로드 받습니다.
binary download 에서 최신버젼의 binary를 눌러서 다운로드 받습니다.

$ tar -xvf hadoop-3.3.4.tar.gz

$ mkdir -p ~/app
$ mv hadoop-3.3.4 ~/app/
$ ln -s ~/app/hadoop-3.3.4/ ~/app/hadoop

~/.bashrc 에 다음을 추가 합니다.
정확한 위치는 수정이 필요합니다.

# Java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

# Hadoop
export HADOOP_HOME=/home/anderson/app/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

설치확인은 터미널 종료후 다시 키고 다음을 실행시킴니다.

$ hadoop version
Hadoop 3.3.4

1.3 AWS Preparation

EC2 KeyPair 를 미리 만들어놔야 합니다.

1.4 S3 Bucket

S3 Bucket을 생성합니다.

Amazon EMR은 S3를 사용해서 데이터를 저장하고, 연산을 합니다.

  • Bucket Name: data-emr-tutorial
  • Region: ap-northeast-2
  • ACL: ACL 비활성화됨(권장)

1.5 CSV Data

데이터는 맥도날드 데이터를 사용합니다.
데이터를 로컬 컴퓨터에 다운로드 받습니다.

1.6 Bootstrap (EMR-6.7.0 기준)

클러스터안의 모든 노드들이 동일한 패키지를 갖을 수 있도록 하기 위해서 bootstrap 파일을 만들어 줍니다.

emr_bootstrap.sh

가장 중요한 부분이 pip 버젼의 사용인데, sudo pip 사용시 에러가 납니다. (sudo pip3 는 가능)
pip부분에서 에러가 난다면.. 일단 comment out 시키고 EC2가 생성되면.. 직접 들어가서 pip어떻게 사용되는지 확인하면 됩니다.
또한 S3에 남겨지는 에러 메세지를 보면서 문제를 해결하는게 중요합니다.
특히 spark관련해서 특정 버젼의 pyspark 설치가 필요 할 수 있습니다.

EMR 버젼에 따라서 pip-3.4 또는 pip-3.6 등등 모두 다른 버젼을 갖고 있습니다.
문제는 특정 버젼을 정의시 업그레이드 또는 해당 버젼에서 지원하는 pip 버젼을 알고 있어야 함으로 좋은 방향은 아닙니다.
따라서 pip2 또는 pip3 같은 방식으로 사용하는게 좋습니다.

또한 set -x -e 를 사용했는데, 이는 추후 디버깅시에 어떤 명령어를 사용했는지를 로깅시에 파악하기 좋습니다.
해당 명령어가 없다면 출력된 output만 있고, 어떤 명령어가 사용됐는지 안 보입니다.

#!/bin/bash
set -x -e

# update and install some useful yum packages
sudo yum install -y jq

# Install Python packages
aws s3 cp s3://data-emr-tutorial/bootstrap/requirements.txt ./
sudo pip3 install -U --upgrade pip
pip3 install -U -r requirements.txt

requirements.txt

pyspark==2.3.4 같은 정확한 버젼 설치가 필요하다.
이유는 다른 버젼이라면 sage-maker 와 충돌이 날 수 있는데 에러가 나면.. bootstrap 에서 에러가 나고.. 전체 클러스터가 떨어진다
EMR-6.7.0 기준이다.

pandas
numpy
matplotlib
pyspark==2.3.4

1.7 Upload files

# 복사 / s3:// 반드시 있어야 함
$ aws s3 cp mcdonalds_dataset.csv s3://data-emr-tutorial/data/
$ aws s3 cp emr_bootstrap.sh s3://data-emr-tutorial/bootstrap/
$ aws s3 cp requirements.txt s3://data-emr-tutorial/bootstrap/

# 확인 / 끝에 slash 꼭 붙여줘야 함 / s3:// 로 시작 안해도 됨
$ aws s3 ls data-emr-tutorial/

1.8 Create a Cluster on EMR

AWS EMR 서비스를 들어온 다음에 Create Cluster를 누르면 다음과 같은 화면이 보입니다.
고급 옵션으로 이동 or Go to advanced options을 누른후..

다음이 포함되어 있어야 합니다.

  • Hadoop
  • JupyterHub
  • JupyterEnterpriseGateway - 추후 Notebook 사용시 필요
  • Spark
  • Zeppelin
  • Hue
  • HBase
  • Pig
  • 그리고 스토리지 모드는 S3 를 사용하며 미리 만들어둔 s3://data-emr-tutorial/ 을 사용합니다.

Tutorial 에서는 m4.xlarge 를 사용합니다. (최소 16Gib 메모리가 필요. 그 이하면 클러스터 떨어짐)
또한 100Gb root device EBS volume 을 사용합니다.
기본 10Gb를 사용시 용량문제로 bootstrap error 가 나옵니다.

그리고 부트스트랩 작업에서는 미리 올려둔 emr_bootstrap.sh 를 선택해줍니다.
추가는 부트스트랩 작업 추가에서 사용자 지정 작업 을 선택후 구성 및 추가 를 누르면 됩니다.

마지막으로 EC2 키 페어를 설정합니다.

2. PySpark

2.1 Configure Hadoop

먼저 EMR의 마스터 서버의 주소를 알아냅니다.

이후 core-site.xml 그리고 yarn-site.xml 에서 주소를 넣어야 합니다. 아래와 같이 수정하되, 위에서 복사한 마스터 주소를 치환해서 넣습니다.

$ cd ~/app/hadoop/etc/hadoop

core-site.xml

hdfs://<마스터 퍼블릭 DNS> 형태로 value 태그에 넣어주면 됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://ec2-3-35-132-11.ap-northeast-2.compute.amazonaws.com</value>
</property>
</configuration>

yarn-site.xml

<?xml version="1.0"?>
<configuration>
<property>
    <name>yarn.resourcemanager.address</name>
    <value>ec2-3-35-132-11.ap-northeast-2.compute.amazonaws.com:8032</value>
</property>
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>ec2-3-35-132-11.ap-northeast-2.compute.amazonaws.com</value>
</property>
</configuration>

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
    <name>dfs.permissions.superusergroup</name>
    <value>hdfsadmingroup</value>
    <description>The name of the group of super-users.</description>
</property>
</configuration>

~/.bashrc

# Java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

# Hadoop
export HADOOP_HOME=/home/anderson/app/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH

추가적으로 마스터 서버에 들어가서 다음을 해줍니다.

$ sudo usermod -G hdfsadmingroup -a root

2. EMR Studio

2.1 Create EMR Studio

먼저 EMR Studio 에서 Create Studio 버튼을 눌러서 다음과 같이 생성합니다.

  • Studio name: emr-studio
  • VPC: EMR과 동일한 VPC 선택
  • subnets: EMR과 동일한 subnets 선택
  • Security and access: Default security group
  • Authentication: AWS Identity and Access Management (IAM)
  • Service role: EMR_Notebooks_DefaultRole
  • Workspace storage: 저장할 S3 위치 지정

EMR Studio 생성이 완료되고 해당 studio를 누르면 detail page 화면에서 링크를 찾을 수 있습니다.
해당 링크를 누릅니다.

2.2 Create EMR Workspace

EMR Studio 안으로 들어오면 보이는 화면입니다.
여기서 workspace를 생성할 수 있습니다.
Create Workspace 버튼을 누릅니다.

아래와 같이 workspace 를 생성하되, 반드시 advanced configuration 을 열고 Attach Workspace to an EMR cluster 를 선택합니다.

2.1 Notebook

Amazon EMR 좌측 메뉴에서 노트북을 선택후 노트북 생성을 합니다.
기존 클러스터 누르고, 위에서 만든 클러스터를 선택합니다.