AWS EMR 튜토리얼 – Part 1
안녕하세요!
지난 포스트에서는 하둡 환경을 직접 구성하는 작업을 해봤습니다.
네! 좀 번거롭죠.. 특별히 튜닝한 환경이 필요하지 않은 한 매번 세팅하기가 좀 힘듭니다.
그래서 이번 포스트에서는 하둡 클러스트를 쉽게 배포하고 사용하는 방법에 대해 알아보겠습니다.
AWS의 EMR이라는 서비스를 이용해서, MRJob이나 PySpark를 테스트해보도록 하겠습니다.
파트 1 포스트에서는, 그냥 최대한 간단하게 론칭하고 예제 코드를 돌려보는 정도로만 해보겠습니다. (인스턴스 그냥 만들어 놓고 HDFS를 이용해서 파일 처리하고)
그리고 파트 2부터는 조금 더 제대로 EMR을 사용해보도록 하겠습니다. (AWS CLI 이용하고, S3에 저장하고)
다시 말씀드리지만, 만약 AWS 크레디트가 없는 분들은 이 링크를 활용해서 한번 본인이 받을 수 있는지 확인해보세요!
STEP 1. EMR 클러스터 생성하기
STEP 2. 마스터 노드 접속하기
제 개인적인 생각으로는, 이렇게 SSH로 접속해서 클러스터를 사용하는 게 EMR의 목적이 아닌 것 같은데, 저희는 일단 이번 포스트까지는 한번 테스트해보겠습니다.
그리고 다음 포스트부터 제대로(?) 사용해 보도록 하겠습니다.
시작하기 전에, EMR에 대한 개념을 좀 정리하고 가야 합니다.
이게 뭐 특별하게 새로운 서비스라기보다, 그냥 완벽히 하둡 환경이 설정된 여러 EC2노드를 편리하게 배포하는 거라고 보시면 됩니다. 그래서 클러스터 생성 뒤에 EC2 콘솔 창을 보면, 일반 EC2 인스턴스들처럼 저렇게 돌아가고 있습니다.
이제, 그냥 EC2 인스턴스를 조작했던 것과 똑같이 다루면 됩니다.
그러므로, 22번 포트로 SSH접속을 하려면, 당연히 보안 그룹 (Security Group)에서 포트가 열려있는지 확인부터 하시면 되겠죠?
이제 접속을 시도할 건데, 아래 화면에서 처럼 ‘SSH’ 버튼을 클릭하면, 자동 생성된 ssh 명령어가 제공됩니다.
네, 그냥 일반 Hadoop 클러스터입니다.
그런데 한 가지 좀 번거로운 게 있는데,
git이 안 깔려있습니다..
‘hadoop’ 계정이 root 권한이 없어서, 이걸로 설치할 수도 없습니다.
하지만, 걱정 마세요.
다른 계정으로 로그인하겠습니다.
설치를 마치신 다음에, 로그아웃하시고 다시 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 관련 작업에 익숙하다고 가정을 하고 진행하겠습니다.
위의 명령어를 다 실행하면, 아래와 같은 화면이 나옵니다.
STEP 4. (OPTIONAL) 파라미터 설정하기
보통 적절한 파라미터만 잘 찾아도, 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. 복제본의 개수
특정 파일의 복제본의 개수를 다음과 같은 명령어로 조절할 수 있습니다.
수를 다음과 같은 명령어로 조절 할 수 있습니다.
hadoop fs –setrep –w 2 /test/actors.list
그런데 복제본의 개수가 성능과 무슨 상관이냐?라고 생각하실 수도 있는데, 그 부분은 여러분이 생각해 볼 부분으로 남겨두겠습니다.
3. Worker 노드의 개수
사실 이게 가장 확실한 방법입니다. 파일이 충분히 크다면, 더 많은 Worker노드는 항상 더 좋은 성능을 보장합니다.
그래서 저는 노드를 몇 개 더 추가한 다음에, 위에서 언급한 첫 번째 두 번째 파라미터들을 변경해가며 다시 테스트해보시는 걸 추천합니다.
노드를 추가한 다음에, 꼭!! 데이터 블락들을 잘 분산시켜주는게 중요합니다.
새로 추가된 노드들은 일단 기존에 있던 데이터를 갖고 있지 않기 때문에, 뭐 reducer에서는 역할을 할 수 있어도, mapper 부분에 서는 그냥 놀 수가 있습니다. 그래서 노드를 추가했는데도, 속도가 똑같은 경우가 발생할 수 있습니다.
아래 명령어를 이용하면 쉽게 재-분산시킬 수 있습니다.
hdfs balancer
이렇게 잘 분산을 시켜주면, 모든 노드들이 열심히 일합니다.
STEP 5. (OPTIONAL) 생각해 볼 것 글
Mapper나 Reducer의 개수는 어떻게 결정할 수 있을까? Worker 노드의 수에 따라? 아니면 전체 프로세서의 코어 수에 따라서?
Mapper와 Reducer의 이상적인 비율은 뭘까? 그런 게 있긴 한가?
만약 10개의 노드가 있다면, 10개의 복제본을 만드는 게 성능 향상에 영향이 있는가?
만약에 우리가 10개의 코어 또는 10개의 싱글코어인 노드가 있다면, 10개 이상의 reducer를 만드는 게 의미가 있나?
마치며..
지금까지 EMR을 한번 사용해 봤습니다.
EMR cluster를 중지하는 것을 잊지 마세요. (불필요한 과금을 피하기 위해)
어? 그런데 Stop버튼은 없고 Terminate버튼 만 있네요..
만약에 Terminate 하면 HDFS안에 있는 모든 데이터가 사라질 텐데..
이게 바로 S3를 이용해서 EMR을 사용해야 하는 이유입니다.
다음 포스트에서 S3를 어떻게 이용하는지 알아보도록 하겠습니다.
다음에 봐요.