[:en]Hadoop 101: Multi-node installation using AWS EC2[:ko]Hadoop 101: 멀티노드 설치 AWS EC2[:]

[:en]Hadoop 101: Multi-node installation using AWS EC2[:ko]Hadoop 101: 멀티노드 설치 AWS EC2[:]

[:en]

In this post, we will build the multi-node Hadoop cluster using three EC2 instances ( one for master, two for slaves).

(I will assume that you know how to use AWS. If you don’t, please check this link)



To run Map-Reduce task properly, you need enough memory. Therefore, we will use t2.medium type instance.

(If you are a student and need some free credit, check this link.)

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

Here is the plan.
First of all, we will do all the setting into one instance. Then we will make an image of that instance. After that, we will launch two more instances using that image.

!!!Don’t forget to stop/terminate the instances after your job if you don’t want to pay unnecessarily.

Step 1. Launch EC2 Instance.

Choose Ubuntu 18.04
Choose t2.medium
Put 15 GB for the Storage Size
[Important] Create security group with new name, and open only 22 port.
Then, if you click “Review and Launch”,
It will launch like this.
If you can connect to the instance using SSH, step 1 is done.

Remember that we will set the Hadoop environment as much as possible on this instance.

Step 2. Update the Packages and Download Hadoop

Before we get started to install Hadoop, we need to prepare basic working environment.

Type following command to install the relevant software and packages.

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 face any types of prompt, just type yes or ok, do whatever you can agree.

Now, let’s download Hadoop and set it up.

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

Then, we have to set the path for Hadoop and Java

sudo vi /etc/environment

Change the content with following PATH.

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"

Then, apply the new PATH using the following command.

source /etc/environment

Okay, now the basic installation is done. You can test the basic map-reduce code using the following command.

hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount /usr/local/hadoop/LICENSE.txt ~/output
cat ~/output/part-r-*
Great!

!If you see following error that JAVA_HOME is not set.


Then let’s just export JAVA_HOME again.

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

Step 3. Set up Hadoop Enviroment

Based on my experience the most important thing in this step is checking the code double, triple time.

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. Set SSH

I think this is the most confusing part for the people who are not familiar with Linux or system stuff.

The purpose of this step is giving the master node the ssh access permission for the slave nodes. (It doesn’t need to be done to the other way.)

Firstly, generate the key using the following command. (Just press enter when the instance asks you to type something.)

ssh-keygen -t rsa

And append it to ‘authorized_keys’.

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

If you can access the instance itself without typing the password while using the following command, you have finished the SSH setting.

ssh localhost

Step 6. Create AMI

From this part, we will copy the instance.

If you right-click the instance, you can find the Create Image button.
Just name it as 'hadoop-node'
You can find the new image in the AMI section.

Step 7. Launch Two more instances

Now with the Image that we made, we can launch the exactly the same instances.

  • Select t2.medium
  • Set 2 instances
  • Select the same security group
If the image is prepared, now you should launch new instances.
Select t2.medium again.
Put two for the number of instance.
And choose the same security group that you created just before.
Okay, two more instances are launching, and I named them as master, slave1, and slave2 respectively.

Step 8. Update the security group

It is really important to use security group properly, to open the ports and to limit the access permission.

If you just open all the ports to the world, you will get DoS attack by random people in the world. (It really happened to me and your AWS cost will be over $100 easily.)

Go to the security group and choose the group that we made for the Hadoop cluster.
Okay, here is the important part, we are opening all the port by choosing 'All traffic', but the source will be the nodes using this security group.
You just need to search 'hadoop' from the source form then it will auto-complete the full name.

Step 9. Make a ssh connection

Okay, when I was following others tutorial, I used to skip this part, and I always regretted. Please use a hostname instead of IP address.

Back to the first instance again.

sudo vi /etc/hosts
This is really important! You should use private IP of each instances

Name them like line 2 to 4.

Then, it should be able to connect each instance using the following command without typing the password.

ssh slave1
ssh slave2

To escape from the slave and go back to master, just type 'exit'.

Lastly, update each instance's hosts file as well with following command.

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

Step 10. Test Hadoop Cluster

First, you need to initialize HDFS.

hdfs namenode -format
If you see these messages, it is working fine.

And start the HDFS related processes.

start-dfs.sh
If you type jps and see the Namenode and Secondary NameNode.
If access to one of the slaves, and type jps, you will see DataNode instead.

Make a directory and check if it is made.

hadoop fs -mkdir /test
hadoop fs -ls /
If you can see the consoles like above, it is working.

To see, the datanodes, you can type the command like below.

hdfs dfsadmin -report
Two datanodes are having exactly the same amount of files(24KB) since our number of replication is 2.

Now, let's start yarn with following command.

start-yarn.sh
From the master node, you will see processes like above, from slave node, you will see DataNode and NodeManger.

You should see two slave nodes, if you type following command.

yarn node -list

Okay, let's test if our yarn is working properly.

First, upload the file to HDFS with following command.

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

And run the wordcount example with the command below.

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

If you read the file,

hadoop fs -text /test/output/*
It should be like this.

Step 11(Optional). Test MRjob

https://github.com/Yelp/mrjob

Don't forget to stop/terminate the instances after your job if you don't want to pay unnecessarily.

Thank you!



[:ko]

이 포스트에서는 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

감사합니다.



[:]

13 thoughts on “[:en]Hadoop 101: Multi-node installation using AWS EC2[:ko]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.

  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를 돌리면 연결된 노드들에서 분산처리가 수행되나요?

댓글 남기기

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

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