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 인스턴스 생성
다시 한번 강조 하지만, 한 인스턴스에 최대한 작업을 많이 해놓고 복사를 해서 수고를 줄이는게 목적입니다.
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 콘솔로 돌아와서 다음과 같이 이미지를 생성합니다.
Step 7. 인스턴스 두 개 더 실행하기
이제 위에서 생성한 이미지로, 첫 번째 인스턴스와 완전 똑같은 인스턴스 2개를 더 만들겠습니다.
- t2.medium 선택하기
- 인스턴스 갯수 2 입력하기
- 같은 보안그룹 선택하기
Step 8. 보안 그룹 수정
보안 그룹을 제대로 설정하는게 정말 중요합니다. 얼마나 포트를 열지, 누가한테 열지 등등.
만약 모든 포트를 그냥 아무한테나 열어벌이면, DoS 공격을 받을 수 있습니다. 실제로 당했습니다 …ㅜ
Step 9. SSH 연결 만들기
저를 포함한 많은 분들이 이 부분을 제대로 설정하지 않고 그냥 IP주소로 계속 입력하는 분들이 계신데, 결국에는 늘 후회 했던 걸로 기억합니다. 미래를 위해, hostname을 설정하는게 훨씬 이득입니다.
sudo vi /etc/hosts
그럼 마찬가지로, 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
HDFS에 폴더를 하나 만들어보고 확인을 해봅니다.
hadoop fs -mkdir /test
hadoop fs -ls /
데이터 노드들에 대한 정보를 보고 싶으면, 다음 명령어를 입력하세요.
hdfs dfsadmin -report
이제 Yarn을 다음 명령어를 이용하여 실행해 봅시다.
start-yarn.sh
다음 명령어를 통해서 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을 쓰시려는 분들은 다음과 같이 설치후 테스트해 보세요!
감사합니다.
14 thoughts on “Hadoop 101: 하둡 클러스터 멀티노드 설치 AWS EC2”
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.
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.
will we add HADOOP_HOME directory as path to anywhere?
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.
thanks for your answer. i did your solution 🙂 and i used
source ~/bashrc
command after i add it permanently.
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.
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
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..
안녕하세요 하둡 얀을 활용한 프로젝트를 진행해보려고 공부 중인 학생입니다~
글이 좋은 참고가 됐는데요, 궁금한게 있는데 하둡 클러스터를 형성하는 과정이 step 9에서의 /etc/hosts에 ip를 입력하는 것만으로 가능한건가요?
안녕하세요! Step 9에서는 master, slave1, slave2와 각각의 ip주소를 매핑시켜주는 (또는 alias) 하는 과정이고, 실제적으로 클러스터를 구성하는 과정은 step3에서 이뤄진다고 보시면 될 것 같습니다. 그때 쓰이는 master나 slave1, slave2들이 실제로 의미하는 것은 ip주소가 될 텐데, 이게 주소로 계속 입력을 해버리면, 비효율적이어서 보통 이렇게 hostname을 이용해서 작성합니다.
아아 step 3에서 workers / masters에서 입력해두는걸로 구성이 되는 구조인가보군요? step 9에서는 그 workers와 masters의 실제 ip값을 적어두는거구요?
프로젝트를 위해 독학하고 있는데 하둡 자체가 정보가 너무 적어서 고생하고 있는데 이 게시글이 한줄기 빛 같네요ㅜㅜ 감사합니다
잘봤습니다. 혹시 마지막 부분에서 YARN을 실행시킨 후 wordcount를 돌리면 연결된 노드들에서 분산처리가 수행되나요?
네 맞습니다!
안녕하세요.
aws ec2 로 운영하고 있진 않은데,
Virtualbox 이용해서, putty로 하둡 멀티 클러스터 서버 6개짜리를 만들고 있습니다.
그런데,, public_key generate 시켜서, 서버 2개짜리는 어찌 성공했는데요.
3,4,5,6부터는, 음..
1. 자체키 만들어주기.
2. 다른 5개 서버에도 키 보내주기
3. …. 이걸 모르겠습니다.
근데, 선생님께서 하신 것 보면 굉장히 간단하게 하셨네요.. 어떻게 하셨나요??