[:en]AWS EMR Tutorial – Part 1[:ko]AWS EMR 튜토리얼 – Part 1[:]

[:en]AWS EMR Tutorial – Part 1[:ko]AWS EMR 튜토리얼 – Part 1[:]

[:en]

Hello!

We have set up the Hadoop environment from the previous post.

And YES! It IS a hassle unless you need your own tuned version of the environment.

Therefore, I’ll introduce a more convenient way to use Hadoop environment from this post.

We’ll test MRjob or PySpark using AWS EMR.

In part 1 we’ll launch the EMR and use it very naively (static instances and using HDFS).

From part 2 we’ll use EMR more correctly (?) (using AWS CLI and S3)

Again, if you haven’t get the student credit, check this link.



STEP 1. Launch EMR Cluster

Find the service
Click create cluster
Try to choose the default values that your console gives you.
If you already have a key pair then let’s just use that.
Let’s wait a bit!
If you see the ‘Waiting’ sign, then now it’s running.

STEP 2. ACCESSING MASTER NODE

In my opinion, EMR is not encouraging to access master node using SSH.

However, we’ll try that anyway in this Part 1 post. Then we’ll practice the recommended or proper way of using EMR.

Before we get started, we need to understand the concept of EMR.

This is not a new service. Technically, we’re just deploying a fully configured Hadoop cluster using EC2 instances. Therefore, if you go to your EC2 console after you create the cluster, you will see the three instances that they’re running.

Three instances are running

Now, it’s just like the way that we use AWS EC2 instances.

To access the master node, we need to check if the security group has opened the 22 port.

Click the security group in the red box.

Choose the master related security group (you can recognize it from the group name).
And add 22 port additionally like this picture.

Okay, now let’s try to connect. You can find the auto-generated ssh command from the console like the picture below.

If you click the redbox you will find the command.
Copy and Paste, but mind the path of the key file.
Now we’re in the master node.
You can check the status of HDFS.
You can check the status of Yarn.
You can check the contents in HDFS

Yes, just like a regular Hadoop cluster.

However, there is something annoying.

You can’t use git from this node.

It’s not installed.

You can’t install either since ‘hadoop’ is not a root account.

But, don’t worry.

Let’s login again with different account

use ‘ec2-user’ instead of ‘hadoop’
Then install git with the following command.

After you finish the installation, log out again, and log in with the account name “hadoop”.

STEP 3. TESTING SAMPLE CODE

Let’s test the word frequent example again, with couple gigabytes of file.

git clone https://github.com/thejungwon/AWS_EMR
cd AWS_EMR

curl -L -o actors.list https://www.dropbox.com/s/vofyl0uryectfyt/actors.list?dl=1
hadoop fs -mkdir /test
hadoop fs -put actors.list /test/actors.list

virtualenv -p python3 venv
. venv/bin/activate
pip install mrjob
cp .mrjob.conf ~/.mrjob.conf
python mr_word_freq_count.py -r hdfs:///test/actors.list --output-dir hdfs:///test/output

*It’s important to copy and paste the ‘.mrjob.conf file. Otherwise, you’ll experience an error.

I’m assuming that you’re familiar with basic mrjob task.

If you complete the all the commands above you will just see normal map-reduce output log.

Result logs
You can also monitor in the AWS console.

STEP 4. (OPTIONAL) CONFIGURING PARAMETERS

This is the number of map and reduce tasks information without additional configuration.

Usually, the performance of MRjob can be improved with finding optimal prameter for several configuration.

You need some insight into the system to find the right parameter, but we can still try with some arbitrary changes.

1. Number of mappers and reducers

With passing number of reducer or mapper to MRjob as shown in below command, you can change that setting.

python mr_word_freq_count.py -r hadoop --jobconf mapreduce.job.reduces=15 hdfs:///test/actors.list --output-dir hdfs:///test/output01
python mr_word_freq_count.py -r hadoop --jobconf mapreduce.job.maps=30 hdfs:///test/actors.list --output-dir hdfs:///test/output02
python mr_word_freq_count.py -r hadoop --jobconf mapreduce.job.maps=30 --jobconf mapreduce.job.reduces=15 hdfs:///test/actors.list --output-dir hdfs:///test/output03

As usual in computer science, a high number of mappers and reducers doesn’t always guarantee better performance.

2. Number of replicas

When you check the file in HDFS, the number in the redbox means the number of replicas.

You can change the number of replicas of a particular file using the following command.

hadoop fs –setrep –w 2 /test/actors.list
Then try to run the example code if there are some changes.

But you may think, “What’s the relation between # of replica and performance?”. I will leave this question for you.

3. Number of worker nodes

In fact, this is the most effective way. The number of additional workers will guarantee better performance as long as the file is big enough.

I recommend you try the first and second configuration again after you increase the number of worker nodes.

You can resize the number of worker nodes by clicking that redbox.
Let’s go for four.
It takes some time.

It’s important to distribute the data blocks to all the nodes. Otherwise, only some nodes will work, and you won’t experience any performance improvement.

hdfs balancer
I have run this command several times so that the log might be a bit different.

Then all workers will participate!

This is just my own way to see if all nodes are working together.

STEP 5. (OPTIONAL) THINGS TO THINK ABOUT

How can we decide the number of mappers (map tasks) or reducers (reduce tasks)? Based on the number of worker nodes? Based on the number of processors?

What’s the ideal ratio between the number of mappers and reducers? Does it even exist?

If we have 10 workers, is it always better to set 10 replicas?

If we have a total of 10 cores or 10 workers with single cores, is there any benefit to having more than ten reducers?


Finishing

No stop button

Okay, we have tested a very naive way of using EMR.

Don’t forget to stop the EMR cluster!

Wait a minute, but there is no stop button (only terminate).

If we terminate the cluster, then all the data will vanish.

That’s why we need to use S3 as our persistent storage.

We’ll find out from the next post how we can use S3.

See you later!

[:ko]

안녕하세요!

지난 포스트에서는 하둡 환경을 직접 구성하는 작업을 해봤습니다.

네! 좀 번거롭죠.. 특별히 튜닝한 환경이 필요하지 않은 한 매번 세팅하기가 좀 힘듭니다.

그래서 이번 포스트에서는 하둡 클러스트를 쉽게 배포하고 사용하는 방법에 대해 알아보겠습니다.

AWS의 EMR이라는 서비스를 이용해서, MRJob이나 PySpark를 테스트해보도록 하겠습니다.

파트 1 포스트에서는, 그냥 최대한 간단하게 론칭하고 예제 코드를 돌려보는 정도로만 해보겠습니다. (인스턴스 그냥 만들어 놓고 HDFS를 이용해서 파일 처리하고)

그리고 파트 2부터는 조금 더 제대로 EMR을 사용해보도록 하겠습니다. (AWS CLI 이용하고, S3에 저장하고)

다시 말씀드리지만, 만약 AWS 크레디트가 없는 분들은 이 링크를 활용해서 한번 본인이 받을 수 있는지 확인해보세요!



STEP 1. EMR 클러스터 생성하기

서비스를 검색해서 찾습니다.
Create Cluster 또는 클러스터 생성 버튼을 클릭합니다.
최대한 기본값으로 시작하겠습니다.
키페어가 있으시면 그거 쓰시면 되고, 없으시면 새로 생성하셔서 쓰시면 됩니다.
잠시만 기다려주세요..
만약 Starting에서 Waiting으로 바뀌었다면, 사용할 준비가 된 것입니다.

STEP 2. 마스터 노드 접속하기

제 개인적인 생각으로는, 이렇게 SSH로 접속해서 클러스터를 사용하는 게 EMR의 목적이 아닌 것 같은데, 저희는 일단 이번 포스트까지는 한번 테스트해보겠습니다.

그리고 다음 포스트부터 제대로(?) 사용해 보도록 하겠습니다.

시작하기 전에, EMR에 대한 개념을 좀 정리하고 가야 합니다.

이게 뭐 특별하게 새로운 서비스라기보다, 그냥 완벽히 하둡 환경이 설정된 여러 EC2노드를 편리하게 배포하는 거라고 보시면 됩니다. 그래서 클러스터 생성 뒤에 EC2 콘솔 창을 보면, 일반 EC2 인스턴스들처럼 저렇게 돌아가고 있습니다.

Three instances are running

이제, 그냥 EC2 인스턴스를 조작했던 것과 똑같이 다루면 됩니다.

그러므로, 22번 포트로 SSH접속을 하려면, 당연히 보안 그룹 (Security Group)에서 포트가 열려있는지 확인부터 하시면 되겠죠?

저 빨간 박스 안에 있는 ‘마스터’를 위한 보안 그룹을 클릭합니다.

두 개가 나왔는데, 이름을 잘 보시면 뭐가 마스터를 위한 보안 그룹인지 구분이 가실 겁니다.
22번 포트를 위와 같이 추가합니다.

이제 접속을 시도할 건데, 아래 화면에서 처럼 ‘SSH’ 버튼을 클릭하면, 자동 생성된 ssh 명령어가 제공됩니다.

빨간 박스를 클릭하면 SSH 명령어가 나옵니다.
복붙을 하는데, 키파일의 경로를 다시 확인해주세요.
이제 마스터 노드에 들어왔습니다.
기본적인 HDFS 관련 명령어로, HDFS 상태도 볼 수 있습니다.
Yarn도 마찬가지고요.
이것도 마찬가지

네, 그냥 일반 Hadoop 클러스터입니다.

그런데 한 가지 좀 번거로운 게 있는데,

git이 안 깔려있습니다..

명령어를 찾을 수 없습니다 ㅜ

‘hadoop’ 계정이 root 권한이 없어서, 이걸로 설치할 수도 없습니다.

하지만, 걱정 마세요.

다른 계정으로 로그인하겠습니다.

‘hadoop’ 대신에 ‘ec2-user’로 접속하겠습니다.
그리고 위와 같은 명령어로 git을 설치합니다.

설치를 마치신 다음에, 로그아웃하시고 다시 hadoop계정으로 접속합니다.

STEP 3. 샘플 코드 실행하기

몇 기가 짜리 파일을 이용해서 word-count 예제를 다시 돌려보겠습니다.

git clone https://github.com/thejungwon/AWS_EMR
cd AWS_EMR

curl -L -o actors.list https://www.dropbox.com/s/vofyl0uryectfyt/actors.list?dl=1
hadoop fs -mkdir /test
hadoop fs -put actors.list /test/actors.list

virtualenv -p python3 venv
. venv/bin/activate
pip install mrjob
cp .mrjob.conf ~/.mrjob.conf
python mr_word_freq_count.py -r hdfs:///test/actors.list --output-dir hdfs:///test/output

*꼭 ‘.mrjob.conf’ 파일을 복붙 해주세요, 안 그러면 에러가 발생합니다.

여러분이 MRJob 관련 작업에 익숙하다고 가정을 하고 진행하겠습니다.

위의 명령어를 다 실행하면, 아래와 같은 화면이 나옵니다.

짜잔, 결과 로그
AWS 콘솔에서도 어느 정도 볼 수 있습니다.

STEP 4. (OPTIONAL) 파라미터 설정하기

추가적인 설정이 없을 때, 기본적으로 생성된 Mapper와 Reducer의 개수입니다.

보통 적절한 파라미터만 잘 찾아도, MRjob의 성능을 향상할 수 있습니다.

물론 Hadoop 환경에 대한 깊은 이해가 있을 때 제대로 된 설정을 할 수 있지만, 일단은 임의로 몇 개 바꿔보도록 하겠습니다.

1. Mapper와 Reducer의 개수

아래와 같이 명령을 실행할 때 파라미터를 전달하면 Mapper와 Reducer의 개수를 조절할 수 있습니다.

python mr_word_freq_count.py -r hadoop --jobconf mapreduce.job.reduces=15 hdfs:///test/actors.list --output-dir hdfs:///test/output01
python mr_word_freq_count.py -r hadoop --jobconf mapreduce.job.maps=30 hdfs:///test/actors.list --output-dir hdfs:///test/output02
python mr_word_freq_count.py -r hadoop --jobconf mapreduce.job.maps=30 --jobconf mapreduce.job.reduces=15 hdfs:///test/actors.list --output-dir hdfs:///test/output03

당연히, 컴퓨터 과학에서 항상 그렇듯이 더 많은 Mapper나 Reducer가 항상 더 좋은 성능을 보여주는 건 아닙니다.

2. 복제본의 개수

HDFS안에 있는 파일을 확인하면, 위의 빨간 박스 안의 숫자가 복제본의 개수입니다.

특정 파일의 복제본의 개수를 다음과 같은 명령어로 조절할 수 있습니다.

수를 다음과 같은 명령어로 조절 할 수 있습니다.

hadoop fs –setrep –w 2 /test/actors.list
명령어를 실행하고 다시 보면, 숫자가 이제 2로 바뀐 게 보입니다.

그런데 복제본의 개수가 성능과 무슨 상관이냐?라고 생각하실 수도 있는데, 그 부분은 여러분이 생각해 볼 부분으로 남겨두겠습니다.

3. Worker 노드의 개수

사실 이게 가장 확실한 방법입니다. 파일이 충분히 크다면, 더 많은 Worker노드는 항상 더 좋은 성능을 보장합니다.

그래서 저는 노드를 몇 개 더 추가한 다음에, 위에서 언급한 첫 번째 두 번째 파라미터들을 변경해가며 다시 테스트해보시는 걸 추천합니다.

빨간 박스 안에 있는 ‘resize’ 버튼을 클릭하면 노드의 개수를 조절할 수 있습니다.
2개에서 4개로 가겠습니다.
시간이 좀 걸립니다. (1분?)

노드를 추가한 다음에, 꼭!! 데이터 블락들을 잘 분산시켜주는게 중요합니다.

새로 추가된 노드들은 일단 기존에 있던 데이터를 갖고 있지 않기 때문에, 뭐 reducer에서는 역할을 할 수 있어도, mapper 부분에 서는 그냥 놀 수가 있습니다. 그래서 노드를 추가했는데도, 속도가 똑같은 경우가 발생할 수 있습니다.

아래 명령어를 이용하면 쉽게 재-분산시킬 수 있습니다.

hdfs balancer
저는 몇 번 명령어를 실행한 다음에 나온 로그랑 다를 수 있습니다.

이렇게 잘 분산을 시켜주면, 모든 노드들이 열심히 일합니다.

그냥 저만의 무식하게 확인하는 방법입니다.

STEP 5. (OPTIONAL) 생각해 볼 것 글

Mapper나 Reducer의 개수는 어떻게 결정할 수 있을까? Worker 노드의 수에 따라? 아니면 전체 프로세서의 코어 수에 따라서?

Mapper와 Reducer의 이상적인 비율은 뭘까? 그런 게 있긴 한가?

만약 10개의 노드가 있다면, 10개의 복제본을 만드는 게 성능 향상에 영향이 있는가?

만약에 우리가 10개의 코어 또는 10개의 싱글코어인 노드가 있다면, 10개 이상의 reducer를 만드는 게 의미가 있나?


마치며..

Stop 버튼이 없습니다.

지금까지 EMR을 한번 사용해 봤습니다.

EMR cluster를 중지하는 것을 잊지 마세요. (불필요한 과금을 피하기 위해)

어? 그런데 Stop버튼은 없고 Terminate버튼 만 있네요..

만약에 Terminate 하면 HDFS안에 있는 모든 데이터가 사라질 텐데..

이게 바로 S3를 이용해서 EMR을 사용해야 하는 이유입니다.

다음 포스트에서 S3를 어떻게 이용하는지 알아보도록 하겠습니다.

다음에 봐요.

[:]

댓글 남기기

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

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