AWS에 Hadoop MR 어플리케이션 환경 구축하기

이번 학기에 하둡 프로그래밍 강의를 들으면서 정말 실습 환경의 개선이 필요하다는 생각이 들었습니다… 나약한 실습 환경속에서 과제와 기말 프로젝트를 제출해야하는 후배들을 위해 AWS를 추천합니다!

EC2 Amazon Linux2에 기본 환경 구축

AWS에는 EMR이라는 클러스터 서비스가 있지만, 스터디 목적이라면 비용을 생각해서 사용하지 않겠습니다. Amazon Linux AMI는 EC2에서 편하게 사용할 수 있도록 지원하고 관리하는 리눅스 이미지입니다. 만일 학생용 크레딧이 있다면 t2.medium 인스턴스를 추천합니다.

먼저, JAVA JDK와 Hadoop 파일을 받겠습니다. 실습 환경은 자바 7, 하둡 1.2 버전입니다.

$ sudo yum update -y
$ sudo yum install -y java-1.7.0-openjdk-devel
$ wget https://archive.apache.org/dist/hadoop/core/hadoop-1.2.1/hadoop-1.2.1.tar.gz
$ tar xvfz hadoop-1.2.1

그리고 자바 프로젝트를 위해 Maven도 설치해줍니다.

$ wget http://mirror.navercorp.com/apache/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.tar.gz
$ tar xvfs apache-maven-3.5.3-bin.tar.gz
$ mv apache-maven-3.5.3/ apache-maven
$ sudo vi /etc/profile.d/maven.sh

# Apache Maven Environment Variables
# MAVEN_HOME for Maven 1 - M2_HOME for Maven 2
$ export M2_HOME=/home/ec2-user/apache-maven
$ export PATH=${M2_HOME}/bin:${PATH}

$ chmod +x maven.sh
$ source /etc/profile.d/maven.sh

정상적으로 설치가 되었다면 아래의 명령어에 대한 결과가 나옵니다.

$ java --version
$ mvn --version

Hadoop 환경 구축

실습환경은 Pseudo-Distibuted 모드로 진행합니다. 먼저 Password less SSH Login을 설정해주어야 합니다. 그리고 편의를 위해 hadoop-1.2.1 폴더에 Symbolic link를 생성하겠습니다.

# ssh login setting
$ ssh-keygen -t rsa -P ""
$ cat /home/ec2-user/.ssh/id_rsa.pub >> /home/ec2-user/.ssh/authorized_keys

# symbolic link
$ ln -s hadoop-1.2.1 hadoop

이제 HDFS와 MR 실행을 위해 설정파일을 수정해줍니다. 먼저 hadoop-env.sh을 열어 JAVA_HOME 환경변수를 지정해줍니다. 가상분산모드에서는 masters, slaves 파일을 수정할 필요가 없습니다.

$ cd hadoop
$ vi conf/hadoop-env.sh

# set JAVA_HOME in this file, so that it is correctly defined on
# remote nodes.

# The java implementation to use. Required.
export JAVA_HOME=/usr/lib/jvm/java-1.7.0

# Extra Java CLASSPATH elements.  Optional.
# export HADOOP_CLASSPATH=

이제 core-site.xml 파일을 아래와 같이 수정해줍니다. HDFS 데이터 파일들은 홈 디렉토리의 hadoop-data 폴더에 저장하겠습니다.

$ vi conf/core-site.xml

<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://localhost:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/ec2-user/hadoop-data/</value>
    </property>
</configuration>

hdfs-site.xml 파일도 수정해줍니다. dfs.replication 프로퍼티는 복제 개수를 의미합니다. 일반적으로 복제 개수를 3으로 두는 것을 권장하지만, 실습에서는 Fully-Distributed 모드가 아니기 때문에 1로 설정하겠습니다.

$ vi conf/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

mapred-site.xml 파일도 수정해줍니다. mapred.job.tracker 프로퍼티는 job tracker가 동작하는 서버를 말합니다.

$ vi conf/mapred-site.xml

<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>localhost:9001</value>
    </property>
</configuration>

Hadoop MR

이제 NameNode를 초기화하고 하둡과 관련된 모든 데몬을 실행합니다.

./bin/hadoop namenode-format
./bin/start-all.sh

jps를 통해 자바 프로세스가 제대로 실행되었는지 확인할 수 있습니다.

$ jps
3368 TaskTracker
2991 DataNode
3241 JobTracker
3480 Jps
2872 NameNode
3139 SecondaryNameNode

HDFS 웹 인터페이스 주소는 http://localhost:50070 이며, MapReduce 웹 인터페이스 주소는 http://localhost:50030 입니다. 들어가시면 아래와 같은 화면이 나타납니다.

이제 기본으로 설치되어 있는 WordCount 예제를 실행시켜보겠습니다. 먼저 WordCount 예제의 input 데이터를 HDFS에 업로드하고 jar 파일과 output 경로를 지정해줍니다.

$ ./bin/hadoop fs -put conf/hadoop-env.sh ./hadoop-env.sh
$ ./bin/hadoop jar hadoop-examples-1.2.1.jar wordcount hadoop-env.sh output

HDFS에 write한 결과는 HDFS의 output 경로에서 확인하실 수 있습니다.

$ ./bin/hadoop fs -ls output
$ ./bin/hadoop fs -cat output/part-r-00000

IntelliJ

이번엔 예제가 아니라 Hadoop MR 어플리케이션 프로젝트를 새로 생성해보겠습니다. IntelliJ에서 JAVA, maven 프로젝트를 생성하시면 됩니다.

그리고 pom.xml은 아래와 같이 수정해줍니다.

<groupId>org.swalloow.hadoop</groupId>
<artifactId>hadoop</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-core -->
<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-core</artifactId>
        <version>1.2.1</version>
    </dependency>
</dependencies>

Mapper와 Reducer 클래스를 수정한 다음, mvn packages 명령어를 통해 jar 파일을 생성합니다. 그리고 input 파일을 이전과 동일하게 HDFS에 추가하고 생성한 jar 파일을 통해 MR job을 실행시키시면 됩니다.

아래 링크는 코인 거래 데이터를 입력받아 이동평균선(SMA) 추세를 계산해주는 간단한 예시 프로젝트입니다. 템플릿은 자유롭게 참고하셔도 됩니다!

https://github.com/Swalloow/hadoop-mr-project