Hadoop2016.12.23 23:47


이전 내용에서 각 서버들에 공통적인 기본환경들을 구성하였습니다.

이번에는 본격적으로 Hadoop을 설치하여 서비스를 기동시키고 Mapreduce 테스트까지 돌려보겠습니다.



Hadoop 설치하기


먼저 master서버인 ubuntu0 서버부터 설치를 진행을 합니다.

그리고 진행 중간부분쯤에 설치된 패키지를 나머지 서버들로 배포를 하고 각 서버별로 재수정을 하도록 하겠습니다.


1. data 디렉토리 생성


hadoop의 HDFS(파일시스템)에 사용될 디렉토리를 생성합니다.


### 모든 서버에 data 디렉토리를 생성합니다.

$ sudo mkdir /data

$ sudo chown -R hduser:hadoop /data


### master 서버에서만 namenode 디렉토리를 생성합니다.

$ mkdir /data/tmp /data/namenode


### slave 서버들에서만 datanode와 userlogs 디렉토리를 생성합니다.

$ mkdir /data/tmp /data/datanode /data/userlogs



2. hadoop 2.7.1 설치


하둡 파일을 다운로드하고 설치 및 기본 path 설정을 해줍니다.


$ cd ~


### apache repository로 부터 다운로드

$ wget http://www.us.apache.org/dist/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz


## 압축 해제

$ tar -zxf hadoop-2.7.1.tar.gz


## 디렉토리 이름변경

$ mv hadoop-2.7.1 hadoop


## 유저계정에 path설정

$ vi ~/.bashrc

----------------------------------------------------------------------------------

# Java and Hadoop variables

export HADOOP_HOME=/home/hduser/hadoop

export JAVA_HOME=/opt/jdk/jdk1.8.0_111/ 

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar


## 하둡 환경 설정

$ vi ~/hadoop/etc/hadoop/hadoop-env.sh

----------------------------------------------------------------------------------

export JAVA_HOME=/opt/jdk/jdk1.8.0_111/ 



3. master서버의 config 파일 설정


우선 master서버의 config 파일들이 있는 디렉토리로 이동하여 설정 xml 파일을 작성해줍니다.


$ cd ~/hadoop/etc/hadoop/



### Configuration for the Master

$ vi core-site.xml

----------------------------------------------------------------------------------

<configuration>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://ubuntu0:9000</value>

    </property>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/data/tmp</value>

    </property>

</configuration>


### hdfs 환경 설정 (디폴트 복제는 3이지만 2만 해줍니다.)

$ vi hdfs-site.xml

----------------------------------------------------------------------------------

<configuration>

    <property>

        <name>dfs.replication</name>

        <value>2</value>

    </property>

    <property>

        <name>dfs.namenode.name.dir</name>

        <value>/data/namenode</value>

    </property>

</configuration>


### yarn 환경 설정 (memory와 core수는 각자의 서버에 적절한 값으로 설정해줍니다.)

$ vi yarn-site.xml

----------------------------------------------------------------------------------

<configuration>


    <!-- YARN master hostname -->

    <property>

        <name>yarn.resourcemanager.hostname</name>

        <value>ubuntu0</value>

    </property>


    <!-- YARN settings for lower and upper resource limits -->

    <property>

        <name>yarn.scheduler.minimum-allocation-mb</name>

        <value>512</value>

    </property>

    <property>

        <name>yarn.scheduler.maximum-allocation-mb</name>

        <value>4096</value>

    </property>

    <property>

        <name>yarn.scheduler.minimum-allocation-vcores</name>

        <value>1</value>

    </property>

    <property>

        <name>yarn.scheduler.maximum-allocation-vcores</name>

        <value>2</value>

    </property>


    <!-- Log aggregation settings -->

    <property>

        <name>yarn.log-aggregation-enable</name>

        <value>true</value>

    </property>

    <property>

        <name>yarn.log-aggregation.retain-seconds</name>

        <value>86400</value>

        <description>How long to keep aggregation logs. Used by History Server.</description>

    </property>


</configuration>


### mapreduce 환경 설정 (memory 값은 각자의 서버에 적절하게 지정해주도록 합니다.)

$ vi mapred-site.xml

----------------------------------------------------------------------------------

<configuration>


    <property>

        <name>mapreduce.framework.name</name>

        <value>yarn</value>

    </property>


    <!-- MapReduce ApplicationMaster properties -->

    <property>

        <name>yarn.app.mapreduce.am.resource.mb</name>

        <value>1536</value>

    </property>

    <property>

        <name>yarn.app.mapreduce.am.command-opts</name>

        <value>-Xmx1536m</value>

    </property>


    <!-- Mappers and Reducers settings -->

    <property>

        <name>mapreduce.map.memory.mb</name>

        <value>2048</value>

    </property>

    <property>

        <name>mapreduce.map.cpu.vcores</name>

        <value>1</value>

    </property>

    <property>

        <name>mapreduce.reduce.memory.mb</name>

        <value>4096</value>

    </property>

    <property>

        <name>mapreduce.reduce.cpu.vcores</name>

        <value>1</value>

    </property>

    <property>

        <name>mapreduce.job.reduces</name>

        <value>2</value>

    </property>


    <!-- History Server settings -->

    <property>

        <name>mapreduce.jobhistory.address</name>

        <value>ubuntu0:10020</value>

    </property>

    <property>

        <name>mapreduce.jobhistory.webapp.address</name>

        <value>ubuntu0:19888</value>

    </property>



</configuration>


### 마스터 서버에만 slave 서버들을 등록해줍니다.

$ vi slaves

----------------------------------------------------------------------------------

ubuntu1

ubuntu2

ubuntu3



4. slave 서버들로 배포


지금까지 기본 설치 및 설정한 hadoop 패키지를 다른 서버로 배포합니다.

개별적으로 설치하는 것보다 시간을 단축시킬 수 있어 편리합니다.


### 서버별 배포

$ scp -r /home/hduser/hadoop ubuntu1:/home/hduser/hadoop

$ scp -r /home/hduser/hadoop ubuntu2:/home/hduser/hadoop

$ scp -r /home/hduser/hadoop ubuntu3:/home/hduser/hadoop



5. slave 서버들의 환경 설정


### Configuration for the Slaves

### Slave1 server에서 수정하여 다른 Slave2, Slave3 server들로 동기화 전송함


$ vi core-site.xml

----------------------------------------------------------------------------------

<configuration>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://ubuntu0:9000</value>

    </property>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/data/tmp</value>

    </property>

</configuration>



$ vi hdfs-site.xml

----------------------------------------------------------------------------------

<configuration>

    <property>

        <name>dfs.datanode.data.dir</name>

        <value>/data/datanode</value>

    </property>

</configuration>



$ vi yarn-site.xml

----------------------------------------------------------------------------------

<configuration>


    <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

    </property>


    <!-- Link to the master node -->

    <property>

        <name>yarn.resourcemanager.hostname</name>

        <value>ubuntu0</value>

    </property>


    <!-- Available resources for YARN containers on this node -->

    <property>

        <name>yarn.nodemanager.resource.memory-mb</name>

        <value>7048</value>

    </property>

    <property>

        <name>yarn.nodemanager.resource.cpu-vcores</name>

        <value>2</value>

    </property>


    <property>

        <name>yarn.nodemanager.vmem-check-enabled</name>

        <value>false</value>

    </property>


    <!-- Log aggregation settings -->

    <property>

        <name>yarn.log-aggregation-enable</name>

        <value>true</value>

    </property>

    <property>

        <name>yarn.nodemanager.log-dirs</name>

        <value>/data/userlogs</value>

    </property>

    <property>

        <name>yarn.log.server.url</name>

        <value>ubuntu0:19888</value>

    </property>

    <property>

        <name>yarn.nodemanager.delete.debug-delay-sec</name>

        <value>86400</value>

    </property>


</configuration>


### 변경사항 동기화 전송

$ rsync -av /home/hduser/hadoop/etc/hadoop ubuntu2:/home/hduser/hadoop/etc

$ rsync -av /home/hduser/hadoop/etc/hadoop ubuntu3:/home/hduser/hadoop/etc



6. HDFS 시작


설치가 모두 완료가 되었으니 이제 hdfs (파일시스템)을 기동합니다.


### namenode를 format 하고 hdfs start.

$ hadoop namenode -format daesonyCluster

$ start-dfs.sh    #서비스 시작

$ stop-dfs.sh    #서비스 종료


### web ui에서 Namenode 1개와 Datanode 3개가 잘 나타나면 정상

http://ubuntu0:50070


### 만약 이상이 있다면 각 서버별로 로그들을 확인

$ cd ~/hadoop/logs


여기서 한가지 주의할 점이 있습니다.

초기 설치시에는 해당사항이 없지만 한번 서비스를 진행하다가 다시 namenode를 format 해야하는 일이 생기면, 반듯이 먼저 datanode 하위 모든 파일을 삭제하고 진행을 해야 합니다. 만약 하위 파일들을 삭제하지 않고 format을 하면 namenode의 clusterId와 datanode의 clusterId가 달라져서 정상적으로 동작하지 않을 수 있습니다.

참고 : http://hadooptutorial.info/incompatible-clusterids/



7. Filesystem 테스트


Hadoop 파일시스템에 디렉토리를 생성하고 테스트 파일(/opt/test.txt)을 업로딩 해봅니다.


$ hadoop fs -mkdir /user

$ hadoop fs -mkdir /user/hduser

$ hadoop fs -put /opt/test.txt /user/hduser

$ hadoop fs -ls /user/hduser



8. Yarn 시작


하둡의 분산환경에서 리소스를 관리해주는 yarn 서비스를 시작합니다.


$ start-yarn.sh    #서비스 시작

$ stop-yarn.sh    #서비스 종료


#web ui for yarn

http://ubuntu0:8088



9. history server 시작


application이 실행이 되면 그 수행 기록들이 history server에 남게 됩니다.


$ mr-jobhistory-daemon.sh start historyserver    #서비스 시작

$ mr-jobhistory-daemon.sh stop historyserver    #서비스 종료


#web ui for history

http://ubuntu0:19888



10. MapReduce 예제 실행


여기까지 잘 진행이 되었다면 설치가 모두 완료가 되었습니다.

정상적으로 동작하는지 테스트를 위해서 PI 값을 구하는 예제를 실행해봅니다.


저는 해당 예제의 실행 속도가 약 1분 30초 정도 걸리는 것을 볼 수 있습니다. 

이는 datanode의 갯수와 cpu, memory에 따라 분산처리 성능의 차이가 발생하니 결과값을 비교해 보시길 바랍니다.


$ yarn jar $HADOOP_HOME/share/hadoop/mapreduce/*examples*.jar pi 50 100

----------------------------------------------------------------------------------

Job Finished in 82.415 seconds

Estimated value of Pi is 3.14160000000000000000


# ResourceManager UI or History Server UI 에서 해당 log를 볼수있게됨

$ yarn logs --applicationId application_1482330106523_0001 > pi_app.log


만약에 실행중에 container-is-running-beyond-memory-limits 와 같은 오류가 발생을 한다면 yarn 환경설정에서 메모리 설정에 문제가 발생한 경우입니다. 각 서버별로 로그들을 확인하고 충분한 메모리를 할당해주도록 합니다.

참조 : http://stackoverflow.com/questions/21005643/container-is-running-beyond-memory-limits


수고하셨습니다~ Hadoop 설치가 모두 완료되었습니다.

MapReduce를 사용해서도 많은 것을 수행할 수 있지만, 디스크 IO 작업이 많이 발생하기에 최근에는 메모리 기반의 Spark을 많이 사용하고 있습니다. 다음에는 Spark에 대해서 알아보도록 하겠습니다.




Posted by 대소니

댓글을 달아 주세요

  1. 안녕하십니까 위의 내용대로 하는데 의문이 있습니다.
    yarn 에서는 datanode 가 running 중인데 jps 와 7번 테스트하는데 실행중인 데이터노드가 없다고 합니다.
    이런상황이면 어떻게 해결해야할까요?

    2017.02.16 22:52 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 아마도 하둡 서비스가 정상적으로 올라가지 않았을것 같은데 서비스와 로그를 확인해보시는게 좋을것같습니다~ 만약 서비스가 정상이라면 ssh 접속이 아무런 타이핑 없이 잘 되는지도 확인해보시구요.

      2017.02.17 08:45 신고 [ ADDR : EDIT/ DEL ]
  2. 안녕하십니까 성공해서 댓글을 답니다. 현재 네임노드 1개 데이터 노드 6개 해서 정상적으로 돌아가고 있습니다
    수정한 부분은 user 와 group 을 다시 설정해서 했더니 정상적으로 실행됩니다. 아직 정확한 원인은 불확실 합니다.

    좋은 정보 감사합니다.

    2017.02.20 16:33 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 오우 성공하셨다니 저도 기쁘네요~ 축하드립니다. 노드가 많으신걸 보니 서버 부자시군요 ㅎ 부럽습니다~

      2017.02.20 16:35 신고 [ ADDR : EDIT/ DEL ]
  3. 안녕하세요 최근에 오류가 생겼지만 해결해서 코멘트를 씁니다.
    hdfs dfsadmin -report 해서 정상적인 값이 안나오고
    Configured Capacity: 0 (0 B)
    Present Capacity: 0 (0 B)
    DFS Remaining: 0 (0 B)
    DFS Used: 0 (0 B)
    DFS Used%: NaN%
    Under replicated blocks: 0
    Blocks with corrupt replicas: 0
    Missing blocks: 0
    Missing blocks (with replication factor 1): 0

    로그를 보면
    INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Refresh request received for nameservices: null
    와 나오고 try 만 반복 될경우

    namenode의 9000 (해당 예제 일 경우) 의 포트를 열어주시면 됩니다.
    sudo ufw allow 9000

    2017.05.14 20:16 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 오 안녕하세요. 잊지 않으시고 다시 찾아주셔서 좋은 정보까지 남겨주셔서 너무 감사드립니다. 또 좋은 정보 생기시면 많이 알려주셔요~^^

      2017.05.14 23:57 신고 [ ADDR : EDIT/ DEL ]
  4. SMC

    안녕하세요 제가 컴퓨터 두 대로 마스터컴퓨터는 네임노드랑 데이터노드 slave 컴퓨터는 데이터노드로 해서 네임노드 한개와 데이터노드 두개로 설정하려고 하는데 xml을 제 나름대로 고쳐봤지만 네임노드를 포맷하면 네임노드가 할당이 안되더라구요 혹시 xml 코드 좀 받을 수 있을까요 ㅜㅜ

    2017.06.30 14:40 [ ADDR : EDIT/ DEL : REPLY ]
    • 안녕하세요~ XML은 위에 포스팅에 나와있는 그대로 입니다~ 복사하셔서 환경에 맞게 수정해서 사용하셔도 되구요.

      포스팅 중간에 있는 빨간색 박스에 네임노드 삭제시 클러스터id가 달라지는 문제에 대해 링크가 있으니 참고하시면 좋을것 같습니다~

      2017.06.30 14:45 신고 [ ADDR : EDIT/ DEL ]
  5. bibibim

    안녕하세요!

    올려주신 글 덕분에 클러스터 셋업을 수월히 수행하고 있습니다.

    그런데 yarn 에서 막히는 부분이 있어 질문 드립니다.

    저의 상황은
    1. ubuntu0:50070 에 접속할 때는 datanode의 상황이 잘 표시되고 있습니다.
    2. start-dfs.sh, start-yarn.sh 를 실행한 뒤 마스터에서 jps 명령어 수행 시 ResourceManager, SecondaryNameNode, NameNode, JobHistoryServer 이 수행중
    3. 슬레이브레서는 jps 수행 시 DataNode, NodeManager 이 수행중
    입니다.

    4. 그런데 ubuntu0:19888 (yarn web ui) 에 접속했을 때는 가용한 자원이 표시되지 않고 모두 0으로 표시되고 있습니다.

    그리고 예제
    yarn jar $HADOOP_HOME/share/hadoop/mapreduce/*examples*.jar pi 50 100
    을 실행시키면 진행이 되지 않고 타임아웃이 발생합니다.

    제가 해본 조치로는
    1. 마스터와 슬레이브의 방화벽 모두 비활성화
    2. 마스터와 슬레이브의 방화벽 모두 활성화 한 뒤 특정 포트 allow(8088, 19888, 9000, 8080, 50010, 7077, 9000등)

    입니다.

    설치과정을 처음부터 끝까지 다시 진행해 보았지만 똑같은 상황이 발생하고 있습니다. 혹시 글에는 적지 않으셨지만 겪으셨던 상황이 있다면 조언 부탁드립니다 ㅠㅠ 감사합니다!!

    2017.09.03 18:45 [ ADDR : EDIT/ DEL : REPLY ]
    • bibibim

      Hadoop Cluster & Spark 설치하기 - 3.Spark 설치 게시글의 comment에 저와 똑같은 현상을 경험하신 분이 있더라구요!
      그래서 http://blog.naver.com/alice_k106/220451472888

      해당 링크를 참고해서 yarn-site.xml 파일도 수정해 보았지만 여전히 문제가 해결되지 않았습니다..

      2017.09.03 20:57 [ ADDR : EDIT/ DEL ]
    • 안녕하세요~

      네 분산환경을 설정하기 위한 내용이 원래
      좀 어렵기는 합니다. 가용한 자원을 할당해주는 것이 필요하고 이때 자원을 할당하는 기준은 실행하고자 하는 task에 따라도 다르기 때문이에요.

      일단 제가 하면서 문제가 되었던 것들은 위에 기재를 해놓았으니 찬찬히 보시면 좋을 것 같아요~

      그리고 생각하는 문제의 원인으로는
      1. 마스터에서 슬레브 접속이 잘되는 지
      2. 재설치하면서 clusterId 값이 달라졌는지
      3. 설정 파일을 셋팅 항목과 값들을 확인

      서버마다 환경마다 설정파일의 항목들이 달라지니 하둡 도큐먼트 찾아보시면서 체크를 해보시면 좋을 것 같습니다~

      화이팅하세요~^^

      2017.09.05 15:41 신고 [ ADDR : EDIT/ DEL ]
  6. 하하

    안녕하세요. 글 감사합니다 ! 노트북 한대에 현재 싱글노드 구축한 상황입니다. 분산환경설정으로 바꿀려면 . 버츄얼박스 하나에 우분투설치해 하둡 가상환경 만들면 되는지요 ? . 다만 대소니님은 3대를 따로 하셨지만. 실습과정이라 어려워서요.
    여기에 있는 슬레이브노드 1개만 버츄얼박스 등록하면 되나요 ?

    2018.02.20 16:13 [ ADDR : EDIT/ DEL : REPLY ]
    • 움 저는 그렇게는 안해봤는데 마스터랑 슬레이브랑 서로 네트워크 통신이 가능한 연결만 된다면 구성은 가능할것 같습니다. ^^

      2018.02.20 16:16 신고 [ ADDR : EDIT/ DEL ]
  7. ycw

    ### namenode를 format 하고 hdfs start.

    $ hadoop namenode -format daesonyCluster

    $ start-dfs.sh #서비스 시작
    명령어 실행시 네임노드 ,데이터노드들이 전혀 잡히지 않는데 어떻게해야할까요..


    2018.04.21 04:24 [ ADDR : EDIT/ DEL : REPLY ]
  8. ycw


    hduser@ubuntu0:~/hadoop/logs$ start-dfs.sh
    Starting namenodes on [ubuntu0]
    ubuntu0: starting namenode, logging to /home/hduser/hadoop/logs/hadoop-hduser-namenode-ubuntu0.out
    localhost: starting datanode, logging to /home/hduser/hadoop/logs/hadoop-hduser-datanode-ubuntu0.out
    ubuntu1: starting datanode, logging to /home/hduser/hadoop/logs/hadoop-hduser-datanode-ubuntu1.out
    ubuntu2: starting datanode, logging to /home/hduser/hadoop/logs/hadoop-hduser-datanode-ubuntu2.out
    ubuntu3: starting datanode, logging to /home/hduser/hadoop/logs/hadoop-hduser-datanode-ubuntu3.out
    Starting secondary namenodes [0.0.0.0]
    0.0.0.0: starting secondarynamenode, logging to /home/hduser/hadoop/logs/hadoop-hduser-secondarynamenode-ubuntu0.out
    hduser@ubuntu0:~/hadoop/logs$ jps
    6232 Jps
    이런식으로 실행된다고 나오는데 하나도 잡히지 않고 있습니다.

    2018.04.21 04:29 [ ADDR : EDIT/ DEL : REPLY ]
    • 안잡힌다는게 무슨 말씀이신지 모르겠지만 셋팅이 정상적으로 안된것이 아닐까요?

      2018.05.01 11:37 신고 [ ADDR : EDIT/ DEL ]
  9. 자세한 설명 잘 참고하며 작업하고 있습니다. 그런데 몇 가지 문제가 생겨서 질문드립니다.

    (1) master에서 xml 파일들을 수정하고 slave로 배포하는 부분(5.)에서, 그럼 master와 slave의 모든 xml 파일을 똑같이 만들라는 말씀이신가요? 아니면 3. 파트는 master에만, 5. 파트는 slave에만 하는 건가요?

    (2) 다른 곳의 자료를 참고해서 코딩해도 항상 "YARN_CONF_DIR has been replaced by HADOOP_CONF_DIR. Using value of YARN_CONF_DIR."라는 오류가 뜨네요. 혹시 대처법을 아시나요?

    2019.07.02 17:43 [ ADDR : EDIT/ DEL : REPLY ]