본문 바로가기
빅데이터 분석 환경 구축

03. Ubuntu에서 Hadoop 설치 및 환경설정

by pavi03 2022. 4. 25.

- Apache Hadoop 3.2.3를 설치하고 환경설정을 진행한다. 

- 하둡 클러스터를 사용하기 위해서 hdfs-site.xml, hdfs-site.xml, core-site.xml, yarn-site.xml, mapred-site.xml, hadoop-env.sh, workers, masters를 편집한다.

 

1. Apache Hadoop 3.2.3 설치 및 압축 해제

# 설치파일 관리용 디렉토리 생성
sudo mkdir /install_dir && cd /install_dir
# Hadoop 3.2.2 설치
sudo wget https://dlcdn.apache.org/hadoop/common/hadoop-3.2.3/hadoop-3.2.3.tar.gz
# Hadoop 3.2.2 압축 해제
sudo tar -zxvf hadoop-3.2.3.tar.gz -C /usr/local
# Hadoop 디렉토리 이름 변경
sudo mv /usr/local/hadoop-3.2.3 /usr/local/hadoop

 

2. Hadoop 환경 변수 설정

# Hadoop 시스템 환경변수 설정
sudo vim /etc/environment

# 아래 내용 추가 후 저장
PATH 뒤에 ":/usr/local/hadoop/bin" 추가
PATH 뒤에 ":/usr/local/hadoop/sbin" 추가
HADOOP_HOME="/usr/local/hadoop"

# 시스템 환경변수 활성화
source /etc/environment

# Hadoop환 사용자 환경변수 설정
sudo echo 'export HADOOP_HOME=/usr/local/hadoop' >> ~/.bashrc
sudo echo 'export HADOOP_COMMON_HOME=$HADOOP_HOME' >> ~/.bashrc
sudo echo 'export HADOOP_HDFS_HOME=$HADOOP_HOME' >> ~/.bashrc
sudo echo 'export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop' >> ~/.bashrc
sudo echo 'export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop' >> ~/.bashrc
sudo echo 'export HADOOP_YARN_HOME=$HADOOP_HOME' >> ~/.bashrc
sudo echo 'export HADOOP_MAPRED_HOME=$HADOOP_HOME' >> ~/.bashrc

# 사용자 환경변수 활성화
source ~/.bashrc

 

3. hdfs-site.xml 파일 편집

- HDFS에서 사용할 환경 정보를 설정하는 파일이다. hdfs-site.xml 에 설정 값이 없을 경우 hdfs-default.xml 을 기본으로 사용한다.

# hdfs-site.xml 편집
sudo vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml

# 아래 내용으로 수정 후 저장
<configuration>
    <!-- configuration hadoop -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/usr/local/hadoop/data/nameNode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/hadoop/data/dataNode</value>
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/usr/local/hadoop/data/dfs/journalnode</value>
    </property>
    <property>
        <name>dfs.nameservices</name>
        <value>my-hadoop-cluster</value>
    </property>
    <property>
        <name>dfs.ha.namenodes.my-hadoop-cluster</name>
        <value>namenode1,namenode2</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode1</name>
        <value>nn1:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode2</name>
        <value>nn2:8020</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.my-hadoop-cluster.namenode1</name>
        <value>nn1:50070</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.my-hadoop-cluster.namenode2</name>
        <value>nn2:50070</value>
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://nn1:8485;nn2:8485;dn1:8485/my-hadoop-cluster</value>
    </property>
    <property>
        <name>dfs.client.failover.proxy.provider.my-hadoop-cluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>shell(/bin/true)</value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/ubuntu/.ssh/id_rsa</value>
    </property>
    <property> 
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.name.dir</name>
        <value>/usr/local/hadoop/data/name</value>
    </property>
    <property>
        <name>dfs.data.dir</name>
        <value>/usr/local/hadoop/data/data</value>
    </property>
</configuration>

 

4. core-site.xml 파일 편집

- Hadoop 시스템 설정 파일이다. 네트워크 튜닝, I/O 튜닝, 파일 시스템 튜닝, 압축 설정 등 Hadoop 시스템 설정을 할 수 있다.

- HDFS와 MapReduce에서 공통적으로 사용할 환경 정보를 입력할 수 있다.

- core-site.xml 설정 값이 없으면, core-default.xml 을 기본으로 사용한다.

# core-site.xml 편집
sudo vim $HADOOP_HOME/etc/hadoop/core-site.xml

# 아래 내용으로 수정 후 저장
<configuration>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://nn1:9000</value>
        </property>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://my-hadoop-cluster</value>
        </property>
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>nn1:2181,nn2:2181,dn1:2181</value>
        </property>
</configuration>

 

5. yarn-site.xml 파일 편집

- Resource Manager 및 Node Manager에 대한 구성을 정의한다.

# Hadoop yarn-site.xml 파일 설정
sudo vim $HADOOP_HOME/etc/hadoop/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>nn1</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
</configuration>

 

6. mapred-site.xml 파일 편집

- MapReduce 어플리케이션 설정 파일이다.

# Hadoop mapred-site.xml 파일 설정
sudo vim $HADOOP_HOME/etc/hadoop/mapred-site.xml

# 아래 내용으로 수정 후 저장
<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>yarn.app.mapreduce.am.env</name>
                <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
        <property>
                <name>mapreduce.map.env</name>
                <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
        <property>
                <name>mapreduce.reduce.env</name>
                <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
</configuration>

 

7. hadoop-env.sh 파일 편집

# Hadoop hadoop-env.sh 파일 설정
sudo vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh

# 아래 내용 수정 후 저장
# Java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

# Hadoop
export HADOOP_HOME=/usr/local/hadoop

 

8. Hadoop workers 편집

- Hadoop의 worker로 동작할 서버 호스트 이름을 설정한다.

# Hadoop workers 편집
sudo vim $HADOOP_HOME/etc/hadoop/workers

# 아래 내용 수정 후 저장
# localhost << 주석 처리 또는 제거
dn1
dn2
dn3

 

9. Hadoop masters 편집

- Hadoop의 master로 동작할 서버 호스트 이름을 설정한다.

# Hadoop masters 편집
sudo vim $HADOOP_HOME/etc/hadoop/masters

# 아래 내용 수정 후 저장
nn1
nn2

 

 

 

+ hdfs-site.xml 속성 (3)

  • dfs.replication : HDFS 파일 블록 복제 개수 지정한다.
  • dfs.namenode.name.dir : NameNode에서 관리할 데이터 디렉토리 경로 지정한다.
  • dfs.datanode.data.dir : DataNode에서 관리할 데이터 디렉토리 경로 지정한다.
  • dfs.journalnode.edits.dir : JournalNode는 NameNode의 동기화 상태를 유지한다. 특정 시점에 구성된 fsimage snapshot 이후로 발생된 변경 사항을 editlog라 하며, 해당 데이터의 저장 위치를 설정한다.
  • dfs.nameservices : Hadoop 클러스터의 네임서비스 이름을 지정한다.
  • dfs.ha.namenodes.my-hadoop-cluster : Hadoop 클러스터 네임서비스의 NameNode 이름을 지정한다.( “,”콤마로 구분하여 기재한다.)
  • dfs.namenode.rpc-address.my-hadoop-cluster.namenode1 : 클러스터 네임서비스에 포함되는 NameNode 끼리 RPC 통신을 위해 NameNode의 통신 주소를 지정한다.(여기서는 8020포트 사용)
  • dfs.namenode.rpc-address.my-hadoop-cluster.namenode2 : 클러스터 네임서비스에 포함되는 NameNode 끼리 RPC 통신을 위해 NameNode의 통신 주소를 지정한다.(여기서는 8020포트 사용)
  • dfs.namenode.http-address.my-hadoop-cluster.namenode1 : NameNode1(nn1)의 WEB UI 접속 주소를 지정한다.(여기서는 50070포트 사용)
  • dfs.namenode.http-address.my-hadoop-cluster.namenode2 : NameNode2(nn2)의 WEB UI 접속 주소를 지정한다.(여기서는 50070포트 사용)
  • dfs.namenode.shared.edits.dir : NameNoderk editlog를 쓰고/읽을 JournalNode URL 이다. Zookeeper가 설치된 서버와 동일하게 JournalNode를 설정하면 된다. (예 : qjournal://nn1:8485;nn2:8485;dn1:8485/my-hadoop-cluster)
  • dfs.client.failover.proxy.provider.my-hadoop-cluster : HDFS 클라이언트가 Active NameNode에 접근할 때 사용하는 Java class 를 지정한다.
  • dfs.ha.fencing.methods : Favilover 상황에서 기존 Active NameNode를 차단할 때 사용하는 방법을 기재한다. (예 : sshfence 그러나 여기서는 shell(/bin/true)를 이용한다.)
  • dfs.ha.fencing.ssh.private-key-files : ha.fencing.method를 sshfence로 지정하였을 경우, ssh를 경유하여 기존 Active NameNode를 죽이는데. 이 때, passpharase를 통과하기 위해 SSH Private Key File을 지정해야한다.
  • dfs.ha.automatic-failover.enabled : 장애 복구를 자동으로 할 지에 대한 여부를 지정한다.

 

+ core-site.xml 파일 속성 (4)

  • fs.default.name : HDFS의 기본 통신 주소를 지정한다.
  • fs.defaultFS : HDFS 기본 파일시스템 디렉토리를 지정한다.
  • ha.zookeeper.quorum : Zookeeper가 설치되어 동작할 서버의 주소를 기재한다.(여기서 포트는 2181)

 

 

+ HDFS의 고가용성(HA)

HDFS는 네임노드 단일 실패 지점입니다. 네임노드에 문제가 발생하면 모든 작업이 중지되고, 파일을 읽거나 쓸수 없게 됩니다. 하둡 v2에서 이 문제를 해결하기 위해서 HDFS 고가용성(High Availability)을 제공합니다.

HDFS 고가용성은 이중화된 두대의 서버인 액티브(active) 네임노드와 스탠바이(standby) 네임노드를 이용하여 지원합니다. 액티브 네임노드와 스탠바이 네임노드는 데이터 노드로부터 블록 리포트와 하트비트를 모두 받아서 동일한 메타데이터를 유지하고, 공유 스토리지를 이용하여 에디트파일을 공유합니다.

액티브 네임노드는 네임노드의 역활을 수행하고, 스탠바이 네임노드는 액티브 네임노드와 동일한 메타데이터 정보를 유지하다가, 액티브 네임노드에 문제가 발생하면 스탠바이 네임노드가 액티브 네임노드로 동작하게 됩니다. 액티브 네임노드에 문제가 발생하는 것을 자동으로 확인하는 것이 어렵기 때문에 보통 주키퍼를 이용하여 장애 발생시 자동으로 변경될 수 있도록 합니다.

스탠바이 네임노드는 세컨더리 네임노드의 역할을 동일하게 수행합니다. 따라서 HDFS를 고가용성 모드로 설정하였을 때는 세컨더리 네임노드를 실행하지 않아도 됩니다. 고가용성 모드에서 세컨더리 네임노드를 실행하면 오류가 발생합니다.

QJM(Quorum Journal Manager)

QJM은 HDFS 전용 구현체로, 고가용성 에디트 로그를 지원하기 위한 목적으로 설계되었고 HDFS의 권장 옵션입니다. QJM은 저널 노드 그룹에서 동작하며, 각 에디트 로그는 전체 저널 노드에 동시에 쓰여집니다. 일반적으로 저널 노드는 세 개로 구성하며, 그중 하나가 손상되어도 문제가 없는 시스템입니다. 이러한 방식은 주키퍼의 작동 방식과 매우 유사하지만 QJM은 주키퍼를 사용하지 않고도 이런 기능을 구현했다는 점이 중요하다. 물론 HDFS 고가용성은 액티브 네임노드를 선출하기 위해 주키퍼를 이용합니다.

스탠바이 네임노드를 활성화시키는 전환 작업은 장애복구 컨트롤러(failover controller)라는 새로운 객체로 관리됩니다. 다양한 방법으로 장애복구 컨트롤러를 구현할 수 있지만, 기본 설정은 단하나의 네임노드만 활성 상태에 있다는 것을 보장하기 위해 주키퍼를 이용합니다.

NFS(Network File System)

NFS를 이용하는 방법은 에디트 파일을 공유 스토리지를 이용하여 공유하는 방법입니다. 공유스토리지에 에디트 로그를 공유하고 펜싱을 이용하여 하나의 네임노드만 에디트 로그를 기록하도록 합니다.