본문 바로가기

Hadoop/Apache Hadoop

Apache Hadoop 설치 4 ( Hadoop )

마지막으로 hadoop 계정을 이용하여 hadoop을 설정하고 실행시켜보도록 하겠습니다.

 

1. Hadoop 계정 SSH key 생성 및 배포

 

Hadoop 계정 또한 서버 간의 통신이 되어야하기 때문에 key를 설정합니다.

 

ssh-keygen

ssh-copy-id -i .ssh/id_rsa.pub hadoop@hadoop1

ssh-copy-id -i .ssh/id_rsa.pub hadoop@hadoop2

ssh-copy-id -i .ssh/id_rsa.pub hadoop@hadoop3

ssh server01 exit

ssh server02 exit

ssh server03 exit

 

계정 키 배포 방식은 위의 키 배포 방식과 동일합니다.

 

2. Hadoop 3.1.0 설치파일 압축 해제

 

** Hadoop 3.1.0 설치파일 설정 후에 다른 서버에 복사할 예정이므로 우선 1개의 서버에서만 진행해주세요

( 모든 서버 동일 설정을 적용 )

 

압축파일을 원하는 경로로 옮기고 압축을 해제합니다.

 

tar xvfz hadoop-3.1.0.tar.gz

 

이후 config 파일이 있는 디렉토리로 이동합니다.

 

cd hadoop-3.1.0/etc/hadoop

 

3. Hadoop 설정 ( core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml, hadoop-env.sh )

 

vi workers

- Node로 사용할 호스트명을 입력합니다. ( 하둡 2버전에서는 slave 파일명)

hadoop1

hadoop2

hadoop3

 

vi core-site.xml

 

- HDFS와 맵리듀스에서 공통적으로 사용할 환경 정보를 설정합니다.

 

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://NNHA</value>
        </property>
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
        </property>
        <property>
               <name>hadoop.proxyuser.hadoop.hosts</name>
               <value>*</value>
       </property>
        <property>
              <name>hadoop.proxyuser.hadoop.groups</name>
              <value>*</value>
        </property>
</configuration>

 

core-site.xml

hadoop.proxyuser.hadoop.hosts

- 클라이언트에서 hadoop 이라는 계정으로 접속하면 값에 나열된 그룹의 권한으로 활동이 가능합니다.

 

hadoop.proxyuser.hadoop.groups

- 클라이언트에서 hadoop 이라는 계정으로 접속하면 값에 나열된 유저로 impersonate 한다. 

 

값을 *로 설정하면 모든 그룹의 권한 및 유저로 활동이 가능합니다.

 

 

vi hdfs-site.xml

- HDFS에서 사용할 환경정보 설정

 

<configuration>
        <property>
                <name>dfs.client.failover.proxy.provider.NNHA</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>/data01/hadoop/dfs/namenode</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>/data01/hadoop/dfs/datanode</value>
        </property>
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/data01/hadoop/dfs/journalnode</value>
        </property>
        <property>
                <name>dfs.nameservices</name>
                <value>NNHA</value>
        </property>
        <property>
                <name>dfs.ha.namenodes.NNHA</name>
                <value>hadoop1,hadoop2</value>
        </property>
        <property>
                <name>dfs.namenode.rpc-address.NNHA.hadoop1</name>
                <value>hadoop1:8020</value>
        </property>
        <property>
                <name>dfs.namenode.rpc-address.NNHA.hadoop2</name>
                <value>hadoop2:8020</value>
        </property>
        <property>
                <name>dfs.namenode.http-address.NNHA.hadoop1</name>
                <value>hadoop1:9870</value>
        </property>
        <property>
                <name>dfs.namenode.http-address.NNHA.hadoop2</name>
                <value>hadoop2:9870</value>
        </property>
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/NNHA</value>
        </property>
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>sshfence</value>
        </property>
        <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name>
                <value>/home/hadoop/.ssh/id_rsa</value>
        </property>

        <property>
               <name>dfs.permissions.superusergroup</name>
               <value>hadoop</value>
        </property>
</configuration>

 

vi mapred-site.xml

- 맵리듀스에서 사용할 환경정보를 설정

 

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>

-- 아래는 메모리 수동 설정
        <property>
                <name>mapreduce.map.memory.mb</name>
                <value>1024</value>
        </property>
        <property>
                <name>mapreduce.reduce.memory.mb</name>
                <value>2048</value>
        </property>
        <property>
                <name>mapreduce.map.java.opts</name>
                <value>-Xmx1024m</value>
        </property>
        <property>
                <name>mapreduce.reduce.java.opts</name>
                <value>-Xmx2048m</value>
        </property>
        <property>
                <name>mapreduce.task.io.sort.mb</name>
                <value>1792</value>
        </property>
        <property>
                <name>mapreduce.task.timeout</name>
                <value>300000</value>
        </property>

         <property>
                 <name>mapreduce.reduce.java.opts.max.heap</name>
                 <value>3277</value>
        </property>
        <property>
                 <name>mapreduce.map.cpu.vcores</name>
                 <value>1</value>
        </property>
        <property>
                <name>mapreduce.reduce.cpu.vcores</name>
                <value>1</value>
        </property>
</configuration>

 

mapred-site.xml

vi yarn-site.xml

- YARN에서 사용할 환경정보를 설정

메모리 및 cpu와 관련 된 자세한 설정 값은 아래 링크를 확인해주세요.

https://startdatastudy.tistory.com/53

<configuration>
        <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.nodemanager.local-dirs</name>
                <value>/data1/hadoop/yarn/nm-local-dir</value>
        </property>
        <property>
                <name>yarn.resourcemanager.fs.state-store.uri</name>
                <value>/data1/hadoop/yarn/system/rmstore</value>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop1</value>
        </property>
        <property>
                <name>yarn.resourcemanager.address</name>
                <value>hadoop1:8032</value>
        </property>
        <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
        </property>
        <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>cluster1</value>
        </property>
        <property>
               <name>yarn.resourcemanager.ha.rm-ids</name>
               <value>rm1,rm2</value>
        </property>

<!-- rm1 설정 -->
        <property>
              <name>yarn.resourcemanager.hostname.rm1</name>
              <value>hadoop1</value>
        </property>

        <property>
               <name>yarn.resourcemanager.address.rm1</name>
               <value>hadoop1:8032</value>
         </property>
         <property>
              <name>yarn.resourcemanager.scheduler.address.rm1</name>
              <value>hadoop1:8030</value>
        </property>

        <property>
              <name>yarn.resourcemanager.webapp.https.address.rm1</name>
              <value>hadoop1:8090</value>
        </property>

        <property>
              <name>yarn.resourcemanager.webapp.address.rm1</name>
              <value>hadoop1:38088</value>
        </property>

        <property>
              <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
              <value>hadoop1:8031</value>
        </property>
        <property>
              <name>yarn.resourcemanager.admin.address.rm1</name>
              <value>hadoop1:8033</value>
        </property>

<!-- rm2 설정 -->

       <property>
              <name>yarn.resourcemanager.hostname.rm2</name>
              <value>hadoop2</value>
        </property>

        <property>
              <name>yarn.resourcemanager.address.rm2</name>
              <value>hadoop2:8032</value>
        </property>
        <property>
              <name>yarn.resourcemanager.scheduler.address.rm2</name>
              <value>hadoop2:8030</value>
        </property>
        <property>
              <name>yarn.resourcemanager.webapp.https.address.rm2</name>
              <value>hadoop2:8090</value>
        </property>
        <property>
              <name>yarn.resourcemanager.webapp.address.rm2</name>
              <value>hadoop2:38088</value>
        </property>

        <property>
              <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
              <value>hadoop2:8031</value>
        </property>
        <property>
              <name>yarn.resourcemanager.admin.address.rm2</name>
              <value>hadoop2:8033</value>
        </property>
        <property>
                <name>yarn.application.classpath</name>
                <value>
                        /data01/hadoop-3.3.0/etc/hadoop,
                        /data01/hadoop-3.3.0/share/hadoop/common/*,
                        /data01/hadoop-3.3.0/share/hadoop/common/lib/*,
                        /data01/hadoop-3.3.0/share/hadoop/hdfs/*,
                        /data01/hadoop-3.3.0/share/hadoop/hdfs/lib/*,
                        /data01/hadoop-3.3.0/share/hadoop/mapreduce/*,
                        /data01/hadoop-3.3.0/share/hadoop/mapreduce/lib/*,
                        /data01/hadoop-3.3.0/share/hadoop/yarn/*,
                        /data01/hadoop-3.3.0/share/hadoop/yarn/lib/*
                </value>
        </property>

        <!-- Zookeeper 서버 리스트 -->
        <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>manage01:2181,name01:2181,name02:2181</value>
        </property>

        <!--yarn 스케줄러 메모리 설정 + 클래스 선택-->

        <property>
                <name>yarn.scheduler.minimum-allocation-mb</name>
                <value>1024</value>
        </property>
        <property>
                <name>yarn.scheduler.maximum-allocation-mb</name>
                <value>200480</value>
        </property>

        <property>
               <name>yarn.resourcemanager.scheduler.class</name>
               <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
        </property>

        <!--yarn 작업에 할당할 수 있는 총 메모리-->
         <property>
                <name>yarn.nodemanager.resource.memory-mb</name>
                <value>200480</value>
        </property>
        <!-- vcore -->
         <property>
                <name>yarn.nodemanager.resource.cpu-vcores</name>
                <value>38</value>
        </property>
        <property>
                <name>yarn.scheduler.minimum-allocation-vcores</name>
                <value>1</value>
        </property>
        <property>
                <name>yarn.scheduler.maximum-allocation-vcores</name>
                <value>38</value>
        </property>
        <property>
                <name>yarn.app.mapreduce.am.resource.mb</name>
                <value>2560</value>
        </property>
        <property>
                <name>yarn.app.mapreduce.am.command-opts</name>
                <value>-Xmx2048m</value>
        </property>
        <!-- ResourceManager 시작시 state 복구여부 -->
        <property>
                <name>yarn.resourcemanager.recovery.enabled</name>
                <value>true</value>
        </property>
        <!-- persistent store로 사용할 class -->
        <property>
                <name>yarn.resourcemanager.store.class</name>
                <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>
        <!-- Zookeeper 서버 리스트 -->
        <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
        </property>
         <!-- Memory ratio -->
         <property>
                <name>yarn.nodemanager.vmem-pmem-ratio</name>
                <value>2.1</value>
        </property>
        <!-- virtual memory check -->
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>

        <!-- yarn timeline service 설정 : 기본 값 false -->

        <property>
               <name>yarn.timeline-service.enabled</name>
               <value>false</value>
       </property>
</configuration>

 

yarn-site.xml

vi hadoop-env.sh

- jdk 경로와 pids 디렉토리 경로를 지정합니다.

 

[54번째 줄]

export JAVA_HOME=/data/jdk8/ ( jdk 경로 설정 )

모든 서버가 같은 jdk 경로여야 합니다. ( 설정 후 배포 예정 )

 

jdk 경로 설정

 

[211번째 줄]

export HADOOP_PID_DIR=/pids

 

pid files 경로 설정

4. Hadoop 파일 압축 및 배포

 

1개 서버에서 hadoop 설정을 끝냈습니다. 3개 서버 모두 같은 설정을 적용시키기 위해 배포합니다.

** 설정 중 지정한 여러 경로들을 다른 서버도 똑같이 적용해야 합니다. ex) pid files 경로는 3개 서버 모두 /pids 로 되어야 합니다.

 

먼저 설정이 완료된 하둡 서버의 파일을 압축합니다.

 

# 압축

tar cvfz hadoop.tar.gz hadoop-3.1.0

 

# 배포

scp hadoop.tar.gz hadoop@hadoop2:/home/hadoop

scp hadoop.tar.gz hadoop@hadoop3:/home/hadoop

 

옮겨진 서버로 이동하여 배포된 파일을 압축해제합니다.

 

tar xvfz hadoop.tar.gz

 

5. root 계정에서 hadoop 경로 설정, 환경변수 적용

 

- hadoop 계정에서 exit하여 root 계정으로 접속합니다.

vi /etc/profile.d/hadoop.sh

 

hadoop.sh

 

export HADOOP_HOME=/home/hadoop/hadoop-3.1.0

export PATH=$PATH:$HADOOP_HOME/bin

export PATH=$PATH:$HADOOP_HOME/sbin

 

이후 환경변수를 적용하기 위해

 

source /etc/profile.d/hadoop.sh

 

6. Hadoop cluster 실행

 

- 다시 Hadoop 계정으로 접속

- 차례대로 실행해야합니다.

- 각 명령어마다 action server가 다르므로 괄호 안 참고

- format 명령어는 최초 1회 실행 한번 실행하면 다음에 실행 할 필요 x

 

cd hadoop-3.1.0 후 진행

 

./bin/hdfs zkfc -formatZK ( hadoop1 ) # 최초 1회

 

# hadoop1,hadoop2,hadoo3에서 각각 저널노드 실행

./bin/hdfs --daemon start journalnode ( hadoop1,hadoop2,hadoop3 )

 

# 네임노드 초기화

./bin/hdfs namenode -format NNHA ( hadoop1 ) # 최초 1회

* error ( 서버2와 연결이 안되는 경우 해결 : 방화벽확인 및 해제 )

 

# 액티브 네임노드 실행

./bin/hdfs --daemon start namenode ( hadoop1 )

 

# hadoop1에서 주키퍼 장애 컨트롤러 실행

./bin/hdfs --daemon start zkfc ( hadoop1 )

 

# hadoop1에서 전체 데이터노드 실행 ( daemons에 s 꼭 쓰기 )

./sbin/hadoop-daemons.sh start datanode ( hadoop1 )

 

# 스탠바이 네임노드 포맷 ( 액티브 네임노드의 메타데이터가 스탠바이 네임노드로 복사된다. )

./bin/hdfs namenode -bootstrapStandby ( hadoop2 )

 

# hadoop2에서 네임노드(스탠바이 네임노드)를 실행

./bin/hdfs --daemon start namenode ( hadoop2 )

 

# 스탠바이 네임노드용 주키퍼 장애 컨트롤러 실행

./bin/hdfs --daemon start zkfc ( hadoop2 )

 

# Yarn cluster 실행

./sbin/start-yarn.sh ( hadoop1 )

 

7. 각 노드들이 잘 실행되었는지 확인

 

hadoop1

 

hadoop1 서버 노드

 

hadoop2

hadoop2 서버 노드

hadoop3

hadoop3 서버 노드

jps 명령어를 입력했을 때 위 사진 처럼 노드가 출력된다면 성공한 것 입니다.

* 설정 값에 따라 jps 명령어의 결과가 다를 수 있습니다.