![](https://i2.wp.com/codethief.io/wp-content/uploads/2019/03/eduardo-garcia-nieto-1377952-unsplash.jpg?resize=1038%2C576&ssl=1)
AWS EMR 튜토리얼 – Part 1
안녕하세요!
지난 포스트에서는 하둡 환경을 직접 구성하는 작업을 해봤습니다.
네! 좀 번거롭죠.. 특별히 튜닝한 환경이 필요하지 않은 한 매번 세팅하기가 좀 힘듭니다.
그래서 이번 포스트에서는 하둡 클러스트를 쉽게 배포하고 사용하는 방법에 대해 알아보겠습니다.
AWS의 EMR이라는 서비스를 이용해서, MRJob이나 PySpark를 테스트해보도록 하겠습니다.
파트 1 포스트에서는, 그냥 최대한 간단하게 론칭하고 예제 코드를 돌려보는 정도로만 해보겠습니다. (인스턴스 그냥 만들어 놓고 HDFS를 이용해서 파일 처리하고)
그리고 파트 2부터는 조금 더 제대로 EMR을 사용해보도록 하겠습니다. (AWS CLI 이용하고, S3에 저장하고)
다시 말씀드리지만, 만약 AWS 크레디트가 없는 분들은 이 링크를 활용해서 한번 본인이 받을 수 있는지 확인해보세요!
STEP 1. EMR 클러스터 생성하기
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-02-at-1.30.44-PM-1-1024x556.png?resize=640%2C348&ssl=1)
![](https://i0.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-02-at-1.32.16-PM-1-1024x584.png?resize=640%2C365&ssl=1)
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-02-at-1.34.32-PM-1-1024x584.png?resize=640%2C365&ssl=1)
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-02-at-1.34.51-PM-2-1024x584.png?resize=640%2C365&ssl=1)
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-11.22.21-AM.png?fit=680%2C388&ssl=1)
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-11.30.58-AM.png?fit=680%2C388&ssl=1)
STEP 2. 마스터 노드 접속하기
제 개인적인 생각으로는, 이렇게 SSH로 접속해서 클러스터를 사용하는 게 EMR의 목적이 아닌 것 같은데, 저희는 일단 이번 포스트까지는 한번 테스트해보겠습니다.
그리고 다음 포스트부터 제대로(?) 사용해 보도록 하겠습니다.
시작하기 전에, EMR에 대한 개념을 좀 정리하고 가야 합니다.
이게 뭐 특별하게 새로운 서비스라기보다, 그냥 완벽히 하둡 환경이 설정된 여러 EC2노드를 편리하게 배포하는 거라고 보시면 됩니다. 그래서 클러스터 생성 뒤에 EC2 콘솔 창을 보면, 일반 EC2 인스턴스들처럼 저렇게 돌아가고 있습니다.
![](https://i2.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-11.38.17-AM.png?fit=680%2C388&ssl=1)
이제, 그냥 EC2 인스턴스를 조작했던 것과 똑같이 다루면 됩니다.
그러므로, 22번 포트로 SSH접속을 하려면, 당연히 보안 그룹 (Security Group)에서 포트가 열려있는지 확인부터 하시면 되겠죠?
![](https://i2.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-11.40.47-AM.png?fit=680%2C388&ssl=1)
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-11.42.36-AM.png?fit=680%2C388&ssl=1)
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-11.44.35-AM.png?fit=680%2C388&ssl=1)
이제 접속을 시도할 건데, 아래 화면에서 처럼 ‘SSH’ 버튼을 클릭하면, 자동 생성된 ssh 명령어가 제공됩니다.
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-12.38.01-PM.png?fit=680%2C388&ssl=1)
![](https://i2.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-12.40.22-PM.png?resize=640%2C258&ssl=1)
![](https://i2.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-12.42.20-PM.png?fit=680%2C391&ssl=1)
![](https://i0.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-12.51.18-PM.png?resize=610%2C900&ssl=1)
![](https://i2.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-12.52.01-PM.png?fit=680%2C74&ssl=1)
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-12.52.24-PM.png?resize=509%2C139&ssl=1)
네, 그냥 일반 Hadoop 클러스터입니다.
그런데 한 가지 좀 번거로운 게 있는데,
git이 안 깔려있습니다..
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-12.43.40-PM.png?resize=640%2C373&ssl=1)
‘hadoop’ 계정이 root 권한이 없어서, 이걸로 설치할 수도 없습니다.
하지만, 걱정 마세요.
다른 계정으로 로그인하겠습니다.
![](https://i2.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-12.45.30-PM.png?fit=680%2C438&ssl=1)
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-12.47.00-PM.png?fit=680%2C83&ssl=1)
설치를 마치신 다음에, 로그아웃하시고 다시 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 관련 작업에 익숙하다고 가정을 하고 진행하겠습니다.
위의 명령어를 다 실행하면, 아래와 같은 화면이 나옵니다.
![](https://i0.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-1.25.05-PM.png?resize=640%2C445&ssl=1)
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-1.30.33-PM.png?fit=680%2C387&ssl=1)
STEP 4. (OPTIONAL) 파라미터 설정하기
![](https://i2.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-1.32.56-PM.png?resize=264%2C117&ssl=1)
보통 적절한 파라미터만 잘 찾아도, 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. 복제본의 개수
![](https://i0.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-2.23.21-PM.png?resize=621%2C136&ssl=1)
특정 파일의 복제본의 개수를 다음과 같은 명령어로 조절할 수 있습니다.
수를 다음과 같은 명령어로 조절 할 수 있습니다.
hadoop fs –setrep –w 2 /test/actors.list
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-2.26.10-PM.png?resize=640%2C189&ssl=1)
그런데 복제본의 개수가 성능과 무슨 상관이냐?라고 생각하실 수도 있는데, 그 부분은 여러분이 생각해 볼 부분으로 남겨두겠습니다.
3. Worker 노드의 개수
사실 이게 가장 확실한 방법입니다. 파일이 충분히 크다면, 더 많은 Worker노드는 항상 더 좋은 성능을 보장합니다.
그래서 저는 노드를 몇 개 더 추가한 다음에, 위에서 언급한 첫 번째 두 번째 파라미터들을 변경해가며 다시 테스트해보시는 걸 추천합니다.
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-2.31.48-PM.png?fit=680%2C388&ssl=1)
![](https://i2.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-2.42.39-PM-1-1024x584.png?resize=640%2C365&ssl=1)
![](https://i1.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-2.52.16-PM.png?fit=680%2C388&ssl=1)
노드를 추가한 다음에, 꼭!! 데이터 블락들을 잘 분산시켜주는게 중요합니다.
새로 추가된 노드들은 일단 기존에 있던 데이터를 갖고 있지 않기 때문에, 뭐 reducer에서는 역할을 할 수 있어도, mapper 부분에 서는 그냥 놀 수가 있습니다. 그래서 노드를 추가했는데도, 속도가 똑같은 경우가 발생할 수 있습니다.
아래 명령어를 이용하면 쉽게 재-분산시킬 수 있습니다.
hdfs balancer
![](https://i2.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-4.12.20-PM.png?resize=640%2C308&ssl=1)
이렇게 잘 분산을 시켜주면, 모든 노드들이 열심히 일합니다.
![](https://i0.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-08-at-3.49.03-PM.png?fit=680%2C425&ssl=1)
STEP 5. (OPTIONAL) 생각해 볼 것 글
Mapper나 Reducer의 개수는 어떻게 결정할 수 있을까? Worker 노드의 수에 따라? 아니면 전체 프로세서의 코어 수에 따라서?
Mapper와 Reducer의 이상적인 비율은 뭘까? 그런 게 있긴 한가?
만약 10개의 노드가 있다면, 10개의 복제본을 만드는 게 성능 향상에 영향이 있는가?
만약에 우리가 10개의 코어 또는 10개의 싱글코어인 노드가 있다면, 10개 이상의 reducer를 만드는 게 의미가 있나?
마치며..
![](https://i2.wp.com/codethief.io/wp-content/uploads/2019/04/Screen-Shot-2019-04-09-at-9.49.50-AM.png?resize=463%2C52&ssl=1)
지금까지 EMR을 한번 사용해 봤습니다.
EMR cluster를 중지하는 것을 잊지 마세요. (불필요한 과금을 피하기 위해)
어? 그런데 Stop버튼은 없고 Terminate버튼 만 있네요..
만약에 Terminate 하면 HDFS안에 있는 모든 데이터가 사라질 텐데..
이게 바로 S3를 이용해서 EMR을 사용해야 하는 이유입니다.
다음 포스트에서 S3를 어떻게 이용하는지 알아보도록 하겠습니다.
다음에 봐요.