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

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번 포트만 열어 놓으세요. 절대 다 열지 마세요.

그리고 Review and Launch를 누르면.
인스턴스 생성중입니다.
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

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

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-*
이렇게 나오면 성공!

! 만약 다음과 같이 JAVA_HOME이 설정되지 않았다는 에러가 나오면


그냥 한번 더 export 해주세요!

export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre

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

감사합니다.

14 thoughts on “Hadoop 101: 하둡 클러스터 멀티노드 설치 AWS EC2

  1. I was able to set up my cluster and run the wordcount example on it the first time. I followed your blog entirely. Then I stopped my EC2 instances and restarted them the next day. Then, I again started the hdfs and yarn … but now I see that only the NameNode and SecondaryNameNode start. The DataNodes do not start. What could be the reason? The private IPs of the EC2 instances have not changed after stopping / restarting. I reset the passwordless-SSH once again to check, but it did not help. Does something come to your mind? Thank you.

    1. Hi, I haven’t really checked if it is working after stop and restart the instances.
      However, I am guessing you may have stopped the instance without stopping the HDFS and Yarn processes. Therefore, there is some unsynchronized(?) data leftover in the data node.

      I recommend you to delete the data in the data nodes with the following commands.
      Stop the processes first.
      (from master node)
      stop-dfs.sh
      stop-yarn.sh

      And remove the data file.
      (from all nodes)
      rm -rf /usr/local/hadoop/data/dataNode

      Try to start from STEP 10 again.

      If it doesn’t work please let me know, I will test from my side.

    1. Normally they find it automatically since Hadoop is already executable by step 2.
      Unless you place the rest of Hadoop files into an unusual location, it will be fine.

      If you want to specify the HADOOP_HOME.

      Either you can temporarily add using this command.

      export HADOOP_HOME=/usr/local/hadoop

      or you can add it permanently above command line to the bottom of “~/.bashrc”

      or you can add the path into /etc/environment like JAVA_HOME.
      (You shouldn’t put the export command in this case)

      Again, the path can be different based on your location of the Hadoop library.

      1. thanks for your answer. i did your solution 🙂 and i used
        source ~/bashrc
        command after i add it permanently.

  2. I got error when I run “hdfs namenode -format”. The error message shown as below:

    /usr/local/hadoop/bin/hdfs: line 319: /usr/lib/jvm/java-8-oracle/jre/bin/java: No such file or directory

    How do I fix this issue? Thank you.

    1. Hi!
      Did you install java using the following command?

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

      If you did, what do you see when you type

      java -version

  3. when I tried to execute start-yarn.sh from the master.. The console displays this error:
    start-yarn.sh
    Starting resourcemanager
    ERROR: Cannot set priority of resourcemanager process 15218
    Starting nodemanagers
    slave1: ERROR: Cannot set priority of nodemanager process 18726
    slave2: ERROR: Cannot set priority of nodemanager process 8501
    I didn’t find the solution in all the forum that I visited..

  4. 안녕하세요 하둡 얀을 활용한 프로젝트를 진행해보려고 공부 중인 학생입니다~
    글이 좋은 참고가 됐는데요, 궁금한게 있는데 하둡 클러스터를 형성하는 과정이 step 9에서의 /etc/hosts에 ip를 입력하는 것만으로 가능한건가요?

    1. 안녕하세요! Step 9에서는 master, slave1, slave2와 각각의 ip주소를 매핑시켜주는 (또는 alias) 하는 과정이고, 실제적으로 클러스터를 구성하는 과정은 step3에서 이뤄진다고 보시면 될 것 같습니다. 그때 쓰이는 master나 slave1, slave2들이 실제로 의미하는 것은 ip주소가 될 텐데, 이게 주소로 계속 입력을 해버리면, 비효율적이어서 보통 이렇게 hostname을 이용해서 작성합니다.

      1. 아아 step 3에서 workers / masters에서 입력해두는걸로 구성이 되는 구조인가보군요? step 9에서는 그 workers와 masters의 실제 ip값을 적어두는거구요?

        프로젝트를 위해 독학하고 있는데 하둡 자체가 정보가 너무 적어서 고생하고 있는데 이 게시글이 한줄기 빛 같네요ㅜㅜ 감사합니다

  5. 잘봤습니다. 혹시 마지막 부분에서 YARN을 실행시킨 후 wordcount를 돌리면 연결된 노드들에서 분산처리가 수행되나요?

  6. 안녕하세요.
    aws ec2 로 운영하고 있진 않은데,
    Virtualbox 이용해서, putty로 하둡 멀티 클러스터 서버 6개짜리를 만들고 있습니다.

    그런데,, public_key generate 시켜서, 서버 2개짜리는 어찌 성공했는데요.

    3,4,5,6부터는, 음..
    1. 자체키 만들어주기.
    2. 다른 5개 서버에도 키 보내주기
    3. …. 이걸 모르겠습니다.

    근데, 선생님께서 하신 것 보면 굉장히 간단하게 하셨네요.. 어떻게 하셨나요??

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

%d 블로거가 이것을 좋아합니다: