티스토리 뷰

0. 사용 환경
- ubuntu 서버용 14.10 여러대 (ubuntu 14.04 LTS를 추천한다.)
- Java 1.8.0_40 (2015년 4월 24일 기준 최신버전이다.)
- Hadoop 2.6.0 (최신버전은 2015년 4월 22일에 나온 2.7.0 버전이다.)
- NFS와 NIS를 사용하여 10대의 노드들이 /home 디렉터리와 사용자 계정을 공유중
* NFS와 NIS를 사용하면 간편하겠지만, 꼭 그럴 필요는 없다.


1. 설치 개념 설명
- 하둡은 자바를 기반으로 만들어진 framework 이다. 따라서 자바가 반드시 설치되어 있어야 한다.
- 하둡은 한 대의 마스터 노드와 여러대의 슬레이브 노드로 구성된다. 마스터와 슬레이브를 한 대의 노드(=컴퓨터)에 설치해도 작동은 한다.
- 하둡은 파일의 저장 및 관리를 담당하는 HDFS(Hadoop File System)와 실제로 map & reduce job을 실행하는 Yarn으로 나눌 수 있다. 실제로도 둘은 각각 따로 실행 및 종료 된다.
- 이 글에서는 SSH Key 등록, Java 설치, 하둡 설치 및 설정, 하둡 실행 및 테스트 등 기초부터 실제 사용까지 상세히 다룰 것이다.
- 질문과 오류 지적은 언제든지 환영한다.

* NFS와 NIS 설정 방법은 아래 링크를 참조.
NFS : http://www.server-world.info/en/note?os=Ubuntu_12.04&p=nfs
NIS : http://www.server-world.info/en/note?os=Ubuntu_12.04&p=nis

(둘 다 우분투 12.04버전 기준이지만 14버전에서도 작동한다. NIS 설치는 페이지 우측 상단에 있는 NIS Client도 클릭해서 설치 해줘야 한다)



2. SSH Key 등록
- 한 노드에서 다른 노드로 접속할 때 비밀번호 없이 바로 로그인을 할 수 있도록 SSH Key라는 것을 생성 후 등록 해야 한다.
- 하둡을 실행시킬 때 모든 노드에서 로그인을 한 뒤 각 노드에서 하둡을 실행하게 된다. 이 때 일일이 비밀번호를 치고 로그인을 할 수는 없기 때문에 SSH Key 등록 과정을 반드시 해주어야 한다.
- 단일 노드에서 설치를 할 경우에는 필요가 없는 과정이다.
- http://opentutorials.org/module/432/3742 에 정말 이해도 쉽고 따라하기 좋게 설명이 되어있으며, 여기서는 이를 참고하여 간략히 과정을 설명하겠다.

(1) 본인 계정의 home 디렉터리에서 ssh-keygen -t rsa 명령어로 키를 생성한다.

(2) 여러가지 입력할 것들이 나오는데, 그냥 엔터를 몇 번 쳐주면 default로 설정된다.

(3) cd .ssh 명령어로 .ssh 디렉터리에 들어간다.

(4) ls -al을 쳐서 권한이 다음과 같이 설정되었는지 확인한다.
drwx------ 2 inthound inthound 4096 Apr  9 16:34 ./
drwxr-xr-x 5 inthound inthound 4096 Apr 16 21:19 ../
-rw-r--r-- 1 inthound inthound 1985 Apr  9 16:40 authorized_keys
-rw------- 1 inthound inthound 1675 Apr 24 10:07 id_rsa
-rw-r--r-- 1 inthound inthound  397 Apr 24 10:07 id_rsa.pub
-rw-r--r-- 1 inthound inthound 4810 Apr 16 21:20 known_hosts
잘 모르겠다면 그냥 다음과 같이 명령어를 쳐준다.

chmod 700 ./
chmod 755 ../
chmod 600 id_rsa
chmod 644 id_rsa.pub  
chmod 644 authorized_keys
chmod 644 known_hosts

* known_hosts 파일이 없다면 touch known_hosts 로 파일을 만들어준다.
* SSH는 권한 설정이 매우 중요하다. 여기서 대부분의 오류가 발생한다.


(5) scp id_rsa.pub 아이디@서버이름:id_rsa.pub 명령어로 id_rsa.pub 파일을 보내고자 하는 슬레이브 노드들에 복사해준다.
* NFS를 사용중인 경우는 마스터노드와 슬레이브노드 모두 같은 디렉터리를 사용하므로 scp를 해줄 필요가 없다.


(6) 해당 노드에 접속해서 cat ~/id_rsa.pub >> ~/.ssh/authorized_keys 명령어로 공개키를 등록해준다.
* NFS를 사용중인 경우는 현재 노드에서 바로 cat ~/id_rsa.pub >> ~/.ssh/authorized_keys 명령을 한번만 해주면 모든 노드에 적용이 되므로 편하다.

(7) ssh 아이디@서버이름 으로 접속할 때 비밀번호가 없이 접속이 되면 성공.


3. Java 설치
- 자바가 이미 설치되어 있는 경우에는 Java 경로를 PATH에 등록하는 것만 따라하면 된다.

(1) http://www.oracle.com/technetwork/java/javase/downloads/index.html 에서 Accept License Agreement에 체크를 하고 해당 리눅스 버전에 맞는 Java SE Development Kit을 다운받는다. 아마 jdk-8u45-linux-x64.tar.gz 이라고 써진 것을 다운 받으면 될 것이다.

(2) WinSCP 등의 파일 전송 프로그램을 사용하여 해당 파일을 각 서버의 본인 계정으 복사해준다.
* NFS를 사용중인 경우는 역시 하나의 노드에 자바를 설치하면 나머지 노드들이 자바를 쓸 수 있어서 편리하다.

(3) tar -xvzf  jdk-8u45-linux-x64.tar.gz 명령어로 압축을 풀어준다.

(4) mv jdk1.8.0_40 java 명령어로 디렉터리 이름을 java로 바꿔준다.

(5) vi .bashrc 명령어로 .bashrc 파일을 연 후 맨 하단에 다음을 입력한다.
############################################################

### Java
############################################################
export JAVA_HOME=$HOME/java

export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
* 위에 있는 # 부분은 해당 PATH가 자바 설정을 위한 것임을 나타내는 것이며, 주석처리되어있으므로 당연히 설정에는 영향을 미치지 않는다. 보기 싫다면 #부분을 모두 빼버려도 좋다.

(6) 저장 후 종료한 뒤, source .bashrc 명령어로 .bashrc를 적용시킨다.

(7) jps 를 쳤을 때 23190 Jps 처럼 나오면 성공. (숫자는 바뀌어도 상관 없다.)
jps 명령어는 나중에 매우 자주 사용될 것이다.
java -version 명령어로도 현재 설치된 자바의 버전을 알 수 있다. 1.8.0_40 버전이라고 뜨면 잘 설치된 것이다.

(8) 나머지 노드들에도 동일하게 설정을 해준다.
* 역시나 NFS를 사용할 경우 한 노드에서만 설정을 해도 나머지가 모두 적용된다.


4. 하둡 설치
(1) http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz 에서 하둡 2.6.0버전을 받은 후 WinSCP등을 통해 본인의 홈 디렉터리로 옮겨준다.
* 하둡의 다운로드 페이지는 http://hadoop.apache.org/#Download+Hadoop 이다.

(2) tar -xvzf hadoop-2.6.0.tar.gz 명령어로 압축을 풀어준다.

(3) mv hadoop-2.6.0 hadoop 명령어로 디렉터리 이름을 hadoop으로 바꿔준다.

(4) vi .bashrc 명령어로 .bashrc 파일을 연 후 맨 하단에 다음을 입력한다.
############################################################

### Hadoop
############################################################
export HADOOP_HOME=$HOME/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export HADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar
export CLASSPATH=$HADOOP_HOME/share/hadoop/common/hadoop-common-2.6.0.jar:$HADOOP_HOME/share/hadoop/mapreduce/:$HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar
* 위의 HADOOP_HOME과 PATH 부분이 있는 3줄은 반드시 해줘야 하는 것들이고, 그 밑으로는 오류를 수정할 때 하나씩 추가한 것들이어서 좀 난잡하다. 필요가 없는 것들이 있을지 모르겠지만 일단 놔두겠다.

(5) source .bashrc 명령어로 .bashrc 파일의 변경 사항을 적용해준다.
* 나머지 노드들도 모두 같게 설정해준다.

(6) 홈 디렉터리에서 mkdir -p hadoop_tmp/hdfs/namenode 명령어와
mkdir -p hadoop_tmp/hdfs/datanode 명령어를 입력한다.
* NFS를 사용할 경우 홈디렉터리가 아니라 각 서버의 로컬 디렉터리에 위의 디렉터리를 만들어줘야 한다. 그러자면 sudo권한이 필요할 수도 있으며, 다 만든 후에 소유권 설정(chown)이 제대로 되어있나 ls -al으로 확인해야 한다.
* NFS를 사용한다 하더라도 로컬 디렉터리 생성은 서로 공유가 안 되기 때문에 각각의 노드에서 해주어야 한다.


5. 하둡 설정
- 위의 4단계까지 했다면 하둡을 설치하는 일은 어느정도 완료한 것이다. 그러나 가장 중요한 몇몇 설정들이 남아있다. 하둡 설치의 핵심이라고도 할 수 있으며, 하둡 실행시 오류가 대부분 이곳에서 발생한다.
cd ~/hadoop/etc/hadoop 로 이동한 후, 해당 디렉터리에 있는 hadoop-env.sh, slaves, core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml 만 손보면 된다.

(1) vi slave 로 파일을 연 후 마스터 노드와 슬레이브 노드를 다음과 같이 적는다.
서버1
서버2
서버3
...
서버10
* 이 때, 서버1~서버10은 vi /etc/hosts 에 등록되어있는 닉네임을 사용하였으며, 닉네임 대신에 아이피를 직접 입력해도 무관하다.

(2) hadoop-env.sh의 25번째줄 근처에 있는 JAVA_HOME을 다음과 같이 변경 및 추가하고 저장 및 종료한다.
export JAVA_HOME=${JAVA_HOME}
export HADOOP_PREFIX=${HADOOP_HOME}

** 추가: log파일 퍼미션 에러가 난다면
$ vi hadoop-env.sh
상단에 환경변수를 추가하고 디렉터리도 해당위치에 만들어준다.
export HADOOP_LOG_DIR={$HADOOP_HOME}/logs/hadoop/core
export HADOOP_ROOT_LOGGE=INFO,console
export HADOOP_PID_DIR=$HADOOP_LOG_DIR
export HADOOP_SECURITY_LOGGER=INFO,NullAppender
export HDFS_AUDIT_LOGGER=INFO,NullAppender
출처: https://beyondj2ee.wordpress.com/2013/05/08/hadoop%EC%9D%98-%EB%A1%9C%EA%B7%B8%ED%8C%8C%EC%9D%BC%EC%9D%80-%EC%96%B4%EB%94%94%EC%97%90-%EC%9E%88%EB%8A%94%EA%B0%80/

(3) core-site.xml에 다음을 작성한다.
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://서버1:9000/</value>
    </property>
</configuration>

(4) hdfs-site.xml에 다음을 작성한다.
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:~/hadoop_tmp/hdfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:~/hadoop_tmp/hdfs/datanode</value>
    </property>
</configuration>
* name.dir과 data.dir의 위치는 본인이 hadoop_tmp의 namenode와 datanode 디렉터리를 만든 곳의 위치로 설정해줘야 한다. 여기서는 홈디렉터리에 hadoop_tmp를 만들었다고 가정하였으며, NFS를 사용할 경우 해당 로컬디렉터리의 위치로 설정해주어야 한다.

(5) mapred-site.xml에 다음을 작성한다.
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

(6) yarn-site.xml에 다음을 작성한다.
<configuration>
<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>서버.ac.kr</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>서버.ac.kr:8025</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>서버.ac.kr:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>서버.ac.kr:8050</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>서버.ac.kr:8055</value>
    </property>
</configuration>
* resourcemanager 부분에서는 외부에서 접속을 해야하기 때문에, 외부 접속이 가능한 도메인 주소나 아이피 주소를 써야한다. 여기서는 서버1.univ.ac.kr 등으로 적었다.
* 8025 등의 숫자는 포트 번호를 뜻하며, 해당 노드에서 사용중이지 않은 포트 번호를 사용해야 한다.

(7) 위에서 수정한 모든 파일들을 scp slave 아이디@서버2:~/hadoop/etc/hadoop 과 같은 명령어로 모든 노드에 복사해준다.
* 혹은 하둡 자체를 복사해줘도 된다.
scp -r hadoop 아이디@서버2:
scp -r hadoop 아이디@서버3:
...

(8) scp .bashrc 아이디@서버2:
scp .bashrc 아이디@서버3:
...
등으로 .bashrc 파일을 모두 뿌려준다.
* NFS를 사용할 경우, 이 과정을 해줄 필요가 없다.


6. 하둡 실행
- NFS를 사용하든 안 하든, 아래 과정은 마스터 노드에서만 하면 된다.
(1) hadoop namenode -format 명령어로 네임노드를 포멧한다.

(2) start-dfs.sh 명령어로 hdfs를 실행시킨다.

(3) 잠시 기다린 후 jps 명령어를 쳤을 때, 마스터 노드에서는
10690 NameNode
10873 DataNode
12060 Jps
11119 SecondaryNameNode
데이터 노드에서는
10873 DataNode
12060 Jps
과 같이 떠야 정상이다. 숫자는 다를 수 있다.

(4) start-yarn.sh 명령어로 yarn(map-reduce 프로그램)을 실행시킨다.

(5) 잠시 기다린 후 jps 명령어를 쳤을 때, 마스터노드에서는
10690 NameNode
11475 NodeManager
12060 Jps
11292 ResourceManager
11119 SecondaryNameNode
데이터노드에서는
11475 NodeManager
10873 DataNode
12060 Jps
과 같이 떠야 정상이다. 숫자는 다를 수 있다.

(6) 웹 브라우저 주소창에 서버1.univ.ac.kr:50070 을 쳤을 때, HDFS 상태를 알려주는 화면이 뜨며, live node 개수가 서버 총 개수과 같으면 HDFS는 정상이다.

(7) 웹 브라우저 주소창에 서버1.univ.ac.kr:8055 를 쳤을 때, Resource 상태를 알려주는 화면이 뜨며, active node 개수가 서버 총 개수과 같으면 Resource manager 또한 정상이다.

(8) 하둡을 끌 때는 stop-all.sh를 사용해서 끌 수 있으며,
start-all.sh로 hdfs와 yarn을 한꺼번에 켤 수도 있다.


7. 하둡 테스트
- 하둡 테스트 방법은 http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/SingleCluster.html을 참고하였다. 단일 노드 뿐 아니라 다중 노드에서도 정상 작동한다.

(1) hdfs dfs -mkdir input 을 쳐서 input 디렉토리를 만든다.

(2) hdfs dfs -lsr 을 쳐서 input 디렉토리가 제대로 생성되었는지 확인한다.

(3) hdfs dfs -put ~/hadoop/etc/hadoop input 명령어로 input 디렉토리에 데이터로 사용할 hadoop 파일들을 업로드한다. 딱히 큰 의미가 있는 것은 아니며, 그냥 여러 파일들이 있으니까 쓰는거다. 본인이 직접 만든 data set을 사용해도 된다.

(4) hadoop jar ~/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input/hadoop/ output 'dfs[a-z.]+'
명령어로 하둡 Job을 실행한다.

(5) map과 reduce의 퍼센트가 조금씩 올라갈 것이다. http://서버1.univ.ac.kr:8055 에도 Job의 진행 경과를 살펴볼 수 있다.

(6) Job이 종료되면 hdfs dfs -lsr 명령어로 output 디렉토리가 제대로 생성되었는지 확인해본다.
* 확인 후 hdfs dfs -rmr output 명령어로 output 디렉토리를 지워줘야 다음번 Job 에서 already existed 오류가 안생긴다.


8. 오류 해결
(1) 하둡을 실행시킨 후 jps를 쳐보면 DataNode가 안 나온다.
-> hadoop_tmp/hdfs/datanode 디렉터리를 삭제하고 새로 만든 후 hadoop namenode -format 을 다시 해주고 (Y/N 을 물을 경우 Y를 해준다), 다시 하둡을 실행해본다.

(2) 하둡을 실행시켰는데 jps에서 제대로 뜨는게 별로 없다.
-> 다른 하둡이 실행되고 있는지 확인해본다. 실행중이라면 그 하둡을 끄거나, 아니면 hdfs-site.xml과 yarn-site.xml 파일의 여러 포트번호를 새로 설정해서 포트간 충돌이 나지 않게 해야 한다.
hdfs-site.xml 에서
  <property>
    <name>dfs.http.address</name>
    <value>http://서버1.univ.ac.kr:50160/</value>
  </property>
  <property>
    <name>dfs.datanode.address</name>
    <value>0.0.0.0:50161</value>
  </property>
  <property>
    <name>dfs.datanode.http.address</name>
    <value>0.0.0.0:50162</value>
  </property>
  <property>
    <name>dfs.datanode.https.address</name>
    <value>0.0.0.0:50163</value>
  </property>
  <property>
    <name>dfs.datanode.ipc.address</name>
    <value>0.0.0.0:50164</value>
  </property>
를 추가해주고, 포터 번호들은 안 쓰는 포트 번호로 지정해준다.
netstat -a -t --numeric-ports -p 명령어로 사용중인 포트 번호를 확인할 수 있다. yarn-site.xml은 아마 고칠 필요가 없을 것이다. 여러 계정이 서버를 사용중이라면, 사용중인 하둡 포트번호를 문서화해서 관리하는 것도 하나의 방법이다.

(3) 하둡이 안 되는데 뭐가 문제인지 모르겠다.
-> 리눅스 방화벽 문제일 수도 있다. /etc/init.d/iptables stop 명령어로 방화벽을 꺼본다. 다시 켤 때는 /etc/init.d/iptables start 명령어를 쓰면 된다.

(4) jps 명령어가 안 먹는다.
-> JAVA_HOME이 제대로 설정되지 않은 문제이다. .bashrc에서 JAVA_HOME을 제대로 변경했는지, 그리고 source .bashrc를 해주었는지 확인해본다.

(5) Input path error가 뜬다.
-> 하둡은 디스크 용량이 90% 이상 사용중일 경우 제대로 작동하지 않는다. 사용중인 용량을 90% 이하로 만들고 다시 실행하면 된다.

(6) Live node 설정이 제대로 안 되어 있다.
-> vi /etc/hosts 에서 127.0.0.1에 등록 되어 있는 본인 서버 이름을 없앤다.
(그냥 127.0.0.1 localhost 만 남아있게 설정해줌. 모든 slave 노드에 적용)


9. 출처 및 유용한 사이트
[SSH Key - 비밀번호 없이 로그인] http://opentutorials.org/module/432/3742

[서버 재시작 시 namenode 시작 안되는 현상] http://egloos.zum.com/entireboy/v/4821605

[HOW TO INSTALL APACHE HADOOP 2.6.0 IN UBUNTU (SINGLE NODE SETUP)] http://pingax.com/install-hadoop2-6-0-on-ubuntu/

[20141029 하둡2.5와 hive설치 및 예제] http://www.slideshare.net/TaeYoungLee1/20141029-25-hive

[BindException] - http://wiki.apache.org/hadoop/BindException

[HDFS Ports] - https://ambari.apache.org/1.2.3/installing-hadoop-using-ambari/content/reference_chap2_1.html
* 하둡의 port관련 정보가 있다.

[Apache Hadoop] - http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/SingleCluster.html
* 하둡의 single node 설치 튜토리얼. 좌측의 Cluster Setup에서는 Wordcount 예제와 port별 설명을 자세하게 알 수 있다.

[Hadoop 2.x : jar file location for wordcount example] - http://ac31004.blogspot.kr/2013/11/hadoop-2x-jar-file-location-for.html
* jar 실행 관련 문제가 생겨서 참고하였다.

[리눅스(Linux) 포트 열기, 방화벽 설정/해제 등.] - http://www.v-eng.co.kr/bbs/board.php?bo_table=faq&wr_id=40


'공부 > Java' 카테고리의 다른 글

Java 면접 질문 예시  (0) 2016.11.23
하둡 2.7.1 설치(싱글 노드) - CentOS 7  (0) 2016.11.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함