Hadoop 101: AWS EC2를 이용한 하둡 멀티노드 클러스터 설치

이 포스트에서는 3개의 EC2 인스턴스를 이용하여 하둡 멀티노드 클러스터를 구축할 것입니다. (하나는 마스터로, 나머지 두개는 슬레이브로).

(AWS를 기본적으로 사용할 줄 아신다는 가정하에 포스팅을 작성할 건데, 혹시 한번도 써본적이 없으신 분들이 이 링크를 참고하세요! link)

맵리듀스, Map-reduce작업을 돌리려면 메모리가 충분해야 하기 때문에 t2.medium인스턴스 타입을 사용할 것입니다.

(t2.medium인스턴스는 무료 범위가 아니기 때문에 과금에 될 수 있는데, 만약 학생이시라면 이 링크를 참조해서 $150 크레딧을 받아 가세요 link.)

  • AWS EC2 t2.medium×3 (1 for a name node, 2 for data nodes)
  • Ubuntu 18.04
  • Hadoop 3.1.1

우선 계획 부터 말씀드리면, 편의를 위해 하나의 인스턴스에 최대한 작업을 한 뒤에, 그 인스턴스를 복사해서 나머지 두 데이터/슬레이브 노드를 만들 예정입니다.

Step 1. EC2 인스턴스 생성

Ubuntu 18.04를 선택합니다.
t2.medium을 선택합니다.
저장소 용량은 15GB로 하겠습니다.
[중요] 시큐리티 그룹을 일단은 이름만 잘 지으시고, 22번 포트만 열어 놓으세요. 절대 다 열지 마세요.
이제 생성중입니다.
ssh를 이용하여 접속을 하셨으면 일단 성공입니다.

다시 한번 강조 하지만, 한 인스턴스에 최대한 작업을 많이 해놓고 복사를 해서 수고를 줄이는게 목적입니다.

Step 2. 패키지 업데이트 및 하둡 다운로드

일단 하둡을 다운 받기 전에, 기본적인 것들을 설치를 해줍니다.

아래 명령어를 복붙해서 관련된 것들을 설치해주세요.

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update && sudo apt-get install -y build-essential python oracle-java8-set-default

뭐라고 물어보면 무조건 yes 또는 엔터 또는 ok!

이제 하둡을 다운 받고 셋팅을 해봅시다.

wget http://apache.claz.org/hadoop/common/hadoop-3.1.1/hadoop-3.1.1.tar.gz
tar -xzvf hadoop-3.1.1.tar.gz
sudo mv hadoop-3.1.1 /usr/local/hadoop

환경변수를 설정하는 방법이 여러가지가 있는데, 우리는 다음과 같이 설정하겠습니다.

sudo vi /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/hadoop/bin:/usr/local/hadoop/sbin"
JAVA_HOME="/usr/lib/jvm/java-8-oracle/jre"
source /etc/environment

일단 기본 설치는 끝났는데, 한번 테스트로 돌려보겠습니다.

/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount /usr/local/hadoop/LICENSE.txt
cat ~/output/part-r-*
이렇게 나오면 성공!

Step 3. 하둡 환경 설정

제 경험상 이 부분에서 가장 중요한 것은, 확인 또 확인입니다.

sudo vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml
sudo vi /usr/local/hadoop/etc/hadoop/core-site.xml
sudo vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
sudo vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
sudo vi /usr/local/hadoop/etc/hadoop/workers
sudo vi /usr/local/hadoop/etc/hadoop/masters

Step 5. SSH 설정

이제 리눅스나 시스템 관련 프로그래밍을 안 해 보신 분들은 이 부분에서 조금 당황하실 수 있습니다.

이 부분의 목적은 마스터 노드가 슬레이브 노드로 비밀번호 없이 접근 할 수 있는 권한을 주는 것입니다. (슬레이브가 마스터로 접근할 필요는 없습니다.)

먼저 다음 명령어로 키를 생성하시고. (추가적으로 입력하지 말고 그냥 엔터를 칩니다.)

ssh-keygen -t rsa

그리고 생성된 키를 ‘authorized_keys’에 붙입니다.

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

만약 여러분 서버 자신에 (localhost) 추가적인 비밀번호 입력없이 다음의 명령어로 바로 접속이 된다면, 이 과정도 성공입니다.

ssh localhost

Step 6. AMI 만들기

다시 AWS 콘솔로 돌아와서 다음과 같이 이미지를 생성합니다.

인스턴스를 우클릭하면 다음과 같은 메뉴가 나옵니다.
이미지 이름은 그냥 hadoop-node로 하겠습니다.
AMI 페이지로 가면 새로 생성 중인 이미지를 볼 수 있습니다.

Step 7. 인스턴스 두 개 더 실행하기

이제 위에서 생성한 이미지로, 첫 번째 인스턴스와 완전 똑같은 인스턴스 2개를 더 만들겠습니다.

  • t2.medium 선택하기
  • 인스턴스 갯수 2 입력하기
  • 같은 보안그룹 선택하기
이미지가 준비되면 우클릭을 하고 Launch를 클릭합니다.
t2.medium을 또 선택하고
인스턴스 개수는 2개로 하고
그리고 같은 보안그룹을 선택합니다.
2개의 인스턴스가 더 생성되고 있습니다. 헷갈리지 않게 이름을 잘 지어주세요.

Step 8. 보안 그룹 수정

보안 그룹을 제대로 설정하는게 정말 중요합니다. 얼마나 포트를 열지, 누가한테 열지 등등.

만약 모든 포트를 그냥 아무한테나 열어벌이면, DoS 공격을 받을 수 있습니다. 실제로 당했습니다 ...ㅜ

보안그룹 페이지에가서 하둡용 보안그룹을 클릭합니다.
이제 여기가 가장 중요한 부분인데, All traffic을 허용하되, 대상은 이 보안그룹을 사용하고 있는 인스턴스에 한해서 입니다. Source 부분에 보안 그룹 이름을 입력하면 알아서 자동완성이 됩니다.

Step 9. SSH 연결 만들기

저를 포함한 많은 분들이 이 부분을 제대로 설정하지 않고 그냥 IP주소로 계속 입력하는 분들이 계신데, 결국에는 늘 후회 했던 걸로 기억합니다. 미래를 위해, hostname을 설정하는게 훨씬 이득입니다.

sudo vi /etc/hosts
꼭 private IP를 이용해주세요, 그 이유에 대해서는 다음 포스트에 자세히 설명하겠습니다.
각각 인스턴스의 private IP를 복사해서 위와 같이 입력을 합니다.
2-4째 줄

그럼 마찬가지로, slave1과 slave2에 비밀번호 입력없이 접속이 가능합니다.

ssh slave1
ssh slave2

슬레이브에서 마스터로 빠져나오려면 그냥 exit를 입력하세요.

마지막으로 각각의 슬레이브들의 hostname도 다음 명령어를 이용해서 업데이트 해줍니다.

cat /etc/hosts | ssh slave1 "sudo sh -c 'cat >/etc/hosts'"
cat /etc/hosts | ssh slave2 "sudo sh -c 'cat >/etc/hosts'"

Step 10. Hadoop Cluster 테스트

먼저 다음 명령어로 초기화를 시켜 주시고.

hdfs namenode -format
이와 같은 메시지를 보면, 제대로 작동한 것입니다.

이제 HDFS 관련 프로그램을 실행하겠습니다.

start-dfs.sh
만약 jps를 입력했을 때 NameNode와 SecondaryNameNode가 보인다면 마스터에서는 정상적으로 작동하는 것입니다.
만약 슬레이브에서 입력했을때 DataNode가 보인다면, 슬레이브도 정상적으로 작동하는 것입니다.

HDFS에 폴더를 하나 만들어보고 확인을 해봅니다.

hadoop fs -mkdir /test
hadoop fs -ls /
다음과 같은 화면이 보이면, 성공!

데이터 노드들에 대한 정보를 보고 싶으면, 다음 명령어를 입력하세요.

hdfs dfsadmin -report
파일의 replication을 2로 설정했기 때문에, 각각의 데이터 노드가 24KB를 동일하게 사용하고 있는 것을 볼 수 있습니다.

이제 Yarn을 다음 명령어를 이용하여 실행해 봅시다.

start-yarn.sh
마스터에서는 위와 같이, 슬레이브에서는 DataNode and NodeManger가 보이면 성공입니다.

다음 명령어를 통해서 Yarn의 노드들을 볼 수 있습니다.

yarn node -list

Yarn이 제대로 동작 하는지 확인해보겠습니다.

우선 HDFS에 파일 하나를 올리고,

hadoop fs -put /usr/local/hadoop/LICENSE.txt /test/

wordcount 예제를 다음 명령어로 실행하겠습니다.

yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount hdfs:///test/LICENSE.txt /test/output

그리고 결과 파일을 읽으면,

hadoop fs -text /test/output/*
짜잔

Step 11(Optional). MRjob 테스트하기

Python이 편해서 MRjob을 쓰시려는 분들은 다음과 같이 설치후 테스트해 보세요!

https://github.com/Yelp/mrjob

git clone https://github.com/Yelp/mrjob.git
cd mrjob/
sudo python setup.py install
python mrjob/examples/mr_word_freq_count.py README.rst -r hadoop > counts

감사합니다.