본문 바로가기
Hadoop

Hadoop Cluster & Spark 설치하기 - 2.Hadoop 설치

by 대소니 2016. 12. 23.


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

이번에는 본격적으로 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에 대해서 알아보도록 하겠습니다.




댓글