래원

[Hadoop] Apache Hadoop 설치 본문

Data Engineering/Hadoop

[Hadoop] Apache Hadoop 설치

Laewon Jeong 2024. 12. 3. 02:04

Apache Hadoop.

 

이번 글에서는 Hadoop 설치 과정에 대해 소개 할 예정이다.

 

글 시작하기에 앞서, 이전 글들을 보고 오는 것을 추천한다.

[Hadoop] Apache Hadoop 소개

[Hadoop] HDFS란?

[Hadoop] MapReduce와 YARN

 

버전 정보


본 글에서 사용하는 환경은 다음과 같다.

OS: Ubuntu 20.04
Java: openjdk-11-jdk
Hadoop: Hadoop 3.4.0

 

 

Java 설치


Hadoop은 Java 기반으로 개발되었다.

따라서, Hadoop의 실행과 관련된 모든 프로세스는 Java로 작성된 프로그램이므로 Java를 먼저 설치해주어야한다.

 

사용할 모든 노드에서 설치를 진행해야 한다.

 

$ sudo apt update
$ sudo apt list openjdk* # 모든 버전 목록 조회
$ sudo apt install openjdk-11-jdk # 원하는 버전 설치

 

잘 설치 됐는지 확인하기 위해서 java -version 명령어를 사용한다.

$ java -version

 

SSH 설정


Hadoop은 노드 간 통신과 협력이 필요하기 때문에 SSH 설정을 필수적으로 해야한다.

Hadoop 설치 전에 SSH를 올바르게 설정해야 클러스터를 원활히 구성할 수 있다.

 

먼저, 사용할 모든 노드의 /etc/hosts 파일에 사용할 노드들의 IP와 이름을 지정해준다.

$ sudo vim /etc/hosts # 사용할 모든 노드에서

<IP> <NAME>
<IP> <NAME>
.
.
.
<IP> <NAME>

/etc/hosts 파일.

 

그리고 사용할 모든 노드에서 root로 접속해 /etc/ssh/sshd_config 파일을 수정해준다.

$ sudo su

vim /etc/ssh/sshd_config

PermitRootLogin no # yes로 변경
...
PasswordAuthentication no # yes로 변경

PermitRootLogin yes.
PasswordAuthentication yes.

 

 

그 후 exit 명령어로 root 계정을 빠져나온다.

 

 SSH를 재실행 해준다.

$ systemctl restart sshd

 

 

그런 다음 마스터노드에서만 다른 노드들에 접근할 수 있게 키를 저장한다.

$ ssh-copy-id -i ~/.ssh/id_rsa.pub dke@SN01 
$ ssh-copy-id -i ~/.ssh/id_rsa.pub dke@SN02 
$ ssh-copy-id -i ~/.ssh/id_rsa.pub dke@SN03 
$ ssh-copy-id -i ~/.ssh/id_rsa.pub dke@SN04 
...
$ ssh-copy-id -i ~/.ssh/id_rsa.pub dke@SN09

 

만약 22번 포트를 사용하지 않는다면 명령어 마지막에 -p <Port> 을 붙여주면된다.

 

Hadoop 설치


 

https://downloads.apache.org/hadoop/common

 

Index of /hadoop/common

 

downloads.apache.org

 

위 사이트에서 원하는 Hadoop 버전을 다운 받을 수 있다.

 

본 글에서는 Hadoop 3.4.0을 사용했기 때문에 hadoop-3.4.0.tar.gz 다운 링크를 복사해 wget 함수를 통해 받아왔다.

 

이 역시 사용할 모든 노드에서 수행해야 한다.

 

$ # 모든 서버에서
$ wget https://downloads.apache.org/hadoop/common/hadoop-3.4.0/hadoop-3.4.0.tar.gz

$ tar -xvzf hadoop-3.4.0.tar.gz # 압축풀기

$ (sudo) ln -s hadoop-3.4.0 hadoop # 심볼릭 링크 생성

 

위 명령어들을 실행하면 위 그림과 같이 저장되어 있을 것이다. 아래 명령어를 통해 hadoop version을 확인할 수 있다.

 

$ hadoop version

hadoop version

환경 변수 설정


다음으로 환경 변수를 설정해주어야 한다.

 

# 모든 서버에서
sudo vim ~/.bashrc

 

다음을 추가한다.

export HADOOP_HOME=<Hadoop 설치한 경로>
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native

 

저장하고 나와서 source ~/.bashrc를 수행한다.

# 모든 서버에서
source ~/.bashrc

 

 

Hadoop JAVA_HOME 설정


다음으로, hadoop-env.sh 스크립트에서 JAVA_HOME 환경 변수를 구성해야한다.

JAVA_HOME 행의 주석을 해제하고 Java OpenJDK 설치 디렉토리로 변경한다.

# 모든 서버에서
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

hadoop-env.sh

 

Hadoop Workers 이름 명시


worker 노드로 사용할 노드들의 이름을 명시한다.

# 마스터 노드에서만
vim $HADOOP_HOME/etc/hadoop/workers

<NAME>
<NAME>
<NAME>
.
.
.
<NAME>

workers.

 

 

core-site.xml 설정


# 모든 서버
vim $HADOOP_HOME/etc/hadoop/core-site.xml

core-site.xml

 

위 그림과 같이 추가해준다. 위 설정은 HDFS를 기본 파일 시스템으로 사용하며, MN:9000이 NameNode의 주소임을 나타낸다.

 

hdfs-site.xml 설정


# 모든 서버
vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml

hdfs-site.xml 설정

 

위 그림과 같이 추가해준다.

 

<property>
  <name>dfs.replication</name>
  <value>3</value>
</property>

 

위 설정은 HDFS에 저장될 데이터의 복제본 개수를 3개로 지정한다.

 

 

<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>SN01:9868</value>
</property>

 

위 설정은 Hadoop 클러스터에서 Secondary NameNode가 제공하는 웹 인터페이스에 액세스할 때 사용되는 주소와 포트를 지정한다.

 

 

<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:<경로>/hadoopdata/hdfs/namenode</value>
</property>

 

 

위 설정은 NameNode의 메타데이터 저장 경로를 지정한다.

 

 

<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:<경로>/hadoopdata/hdfs/datanode</value>
</property>

 

위 설정은 DataNode가 실제 데이터 블록을 저장하는 경로를 지정한다.

 

 

mapred-site.xml 설정


# 모든 서버
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml

mapred-site.xml.

 

위 그림과 같이 추가해준다.

 

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

 

위 설정은 MapReduce 프레임워크를 YARN을 사용하도록 지정한다.

 

 

  <property>
    <name>mapreduce.application.classpath</name>
    <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
  </property>

 

위 설정은 MapReduce 작업에서 사용될 클래스 경로(classpath)를 설정한다.

 

 

yarn-site.xml


# 모든 서버
vim $HADOOP_HOME/etc/hadoop/yarn-site.xml

yarn-site.xml.

 

각 설정에 대한 설명은 다음과 같다.

    # MapReduce Shuffle 활성화
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
		
    # 환경 변수 목록으로, NodeManager가 실행할 때 허용된 환경 변수만 사용할 수 있도록 제한
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
    </property>

    # YARN 클러스터에서 ResourceManager 지정. 본 설정에서는 MN으로 설정
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>MN</value>
    </property>
    
    # NodeManager에서 각 컨테이너에 할당할 수 있는 최대 메모리 설정
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>819200</value>
    </property>
    
    # NodeManager에서 사용할 수 있는 가상 CPU 코어 수 설정
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
       <value>8</value>
    </property>
		
    # YARN 스케줄러가 컨테이너에 할당할 수 있는 최소 vCore 수 설정
    <property>
      <name>yarn.scheduler.minimum-allocation-vcores</name>
      <value>4</value>
    </property>
    
    # YARN 스케줄러가 컨테이너에 할당할 수 있는 최대 vCore 수 설정
    <property>
      <name>yarn.scheduler.maximum-allocation-vcores</name>
      <value>16</value>
    </property>
    
    # YARN 스케줄러가 컨테이너에 할당할 수 있는 최소 메모리 크기
    <property>
      <name>yarn.scheduler.minimum-allocation-mb</name>
      <value>10240</value>
    </property>
    
    # YARN 스케줄러가 컨테이너에 할당할 수 있는 최대 메모리 크기
    <property>
      <name>yarn.scheduler.maximum-allocation-mb</name>
      <value>819200</value>
    </property>

 

Hadoop 실행


기본적인 설정은 끝났으니 이제 실행해보자

 

# 모든 서버 방화벽 해제
systemctl stop firewalld 또는 systemctl disable firewalld

# 마스터 노드에서만
$HADOOP_HOME/bin/hdfs namenode -format # Hadoop foramt (최초 한번만 실행)
$HADOOP_HOME/sbin/start-all.sh #Hadoop 실행

 

정상적으로 실행됐는지 확인해보자

jps

 

jps는 실행 중인 Java 프로세스를 보여주는 유틸리티이다.

Hadoop은 여러 Java 기반 데몬으로 구성되기 때문에 jps 명령어를 통해 빠르게 확인할 수 있다.

 

MN

 

NameNode와 ResourceManager가 정상적으로 실행중인 것을 확인할 수 있다.

 

SN01

 

DataNode와 NodeManager를 비롯해 Secondary NameNode도 정상적으로 실행중인 것을 확인할 수 있다.

 

SN02 ~ SN09

 

DataNode와 NodeManager가 정상적으로 실행중인 것을 확인할 수 있다.

 

HDFS 동작 확인


# 마스터 노드에서
hdfs dfs -ls /

 

hdfs / 경로에 저장된 파일을 확인할 수 있다.

hdfs dfs -ls /

 

# 마스터 노드에서
touch temp.txt

hdfs dfs -put temp.txt /

hdfs dfs -ls /

 

hdfs dfs -put temp.txt /

 

정상적으로 temp.txt 파일이 hdfs의 / 경로에 저장된 것을 확인할 수 있다.

 

또한, 9870포트로 접속해 HDFS 마스터노드 웹 UI를 확인할 수 있고, 8088포트로 접속해 YARN ResourceManger 상태와 실행 중인 작업 등을 제공하는 웹 UI를 확인할 수 있다.

 

마무리


이번 글에서는 Hadoop 설치 과정에 대해 알아보았다.

 

설치 과정이 굉장히 복잡하지만, 정상적으로 동작하는 모습을 보면 쾌감이 느껴지는 것 같다.

 

다음에는 간단한 실습에 대해 포스팅할 예정이다.

'Data Engineering > Hadoop' 카테고리의 다른 글

[Hadoop] Hadoop MapReduce를 이용한 Word Count 실습  (3) 2024.12.03
[Hadoop] MapReduce와 YARN  (0) 2024.12.02
[Hadoop] HDFS란?  (0) 2024.12.01
[Hadoop] Apache Hadoop 소개  (0) 2024.11.24