1. Hadoop이란?
Hadoop은 대량의 데이터를 분산 처리할 수 있도록 설계된 오픈소스 프레임워크입니다. 주로 빅데이터 분석과 대규모 저장소를 운영하는 데 사용됩니다.
공식 문서: Hadoop Documentation
2. 환경 설정
이번 구성에서는 Ubuntu 22.04에서 Docker 컨테이너 3개(마스터 1개, 워커 2개)를 사용하여 Hadoop 클러스터를 구축합니다. Ubuntu에 Docker가 깔려있다고 가정합니다.
2.1. 기본 컨테이너 생성 및 필수 패키지 설치
docker run -i -t --name hadoop-base ubuntu:22.04
- -i -t : 인터랙티브 모드로 컨테이너를 실행합니다.
- --name hadoop-base : 컨테이너 이름을 hadoop-base로 설정합니다.
이제 컨테이너 내부에서 필요한 패키지를 설치합니다.
apt-get update
apt-get upgrade -y
apt-get install -y curl openssh-server rsync wget vim iputils-ping htop openjdk-11-jdk ssh net-tools sudo
설치된 주요 패키지 설명:
- openssh-server: Hadoop 클러스터 간 SSH 통신을 위해 필요합니다.
- rsync: 분산 환경에서 파일을 동기화하는 데 사용됩니다.
- openjdk-11-jdk: Hadoop 실행을 위한 Java 11을 설치합니다.
2.2. Hadoop 다운로드 및 환경 변수 설정
2.2.1. Hadoop 다운로드 및 설치
wget http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-3.4.1/hadoop-3.4.1.tar.gz
tar zxvf hadoop-3.4.1.tar.gz
rm hadoop-3.4.1.tar.gz
mv ./hadoop-3.4.1 /usr/local/hadoop/
Hadoop 3.4.1 버전을 다운로드한 후 압축을 해제하고 /usr/local/hadoop/으로 이동합니다.
cd /usr/local/hadoop
2.2.2. 환경 변수 설정
Hadoop을 편리하게 실행할 수 있도록 제일 하단에 아래를 추가하여 환경 변수를 설정합니다.
vi ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
- $HADOOP_HOME/bin, $HADOOP_HOME/sbin을 PATH에 추가하여 Hadoop 실행을 쉽게 만듭니다.
- $HADOOP_OPTS를 설정하여 Hadoop이 네이티브 라이브러리를 사용할 수 있도록 지정합니다.
환경변수 적용합니다.
source ~/.bashrc
2.3. Hadoop 설정 파일 구성
2.3.1. core-site.xml (HDFS 기본 설정)
vi $HADOOP_HOME/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master1:8020</value>
</property>
</configuration>
- Hadoop 파일 시스템의 기본 URI를 hdfs://master1:8020으로 설정합니다.
- master1이 네임노드(마스터 노드) 역할을 하게 됩니다.
2.3.2. yarn-site.xml (YARN 설정)
vi $HADOOP_HOME/etc/hadoop/yarn-site.xml
<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>
</configuration>
yarn.nodemanager.aux-services : MapReduce 작업을 위해 데이터 셔플링 기능을 활성화합니다.
2.3.3. mapred-site.xml (MapReduce 설정)
vi $HADOOP_HOME/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
MapReduce 프레임워크를 YARN을 기반으로 실행하도록 설정합니다.
2.4. Master 및 Worker 노드 설정
masters 파일 (네임노드 설정)
vi $HADOOP_HOME/etc/hadoop/masters
master1
마스터 노드로 master1을 지정합니다.
workers 파일 (데이터노드 설정)
vi $HADOOP_HOME/etc/hadoop/workers
master1
worker1
worker2
worker1, worker2는 실제 데이터 저장 및 연산을 담당하는 노드입니다.
3. Zookeeper 설정
Zookeeper는 Hadoop의 고가용성을 위한 분산 코디네이션 서비스입니다.
3.1. Zookeeper 다운로드 및 설치
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz
tar zxvf apache-zookeeper-3.9.3-bin.tar.gz
rm apache-zookeeper-3.9.3-bin.tar.gz
mv ./apache-zookeeper-3.9.3-bin /usr/local/zookeeper/
3.2. 데이터 디렉토리 생성
mkdir /usr/local/zookeeper/data
Zookeeper의 데이터 파일을 저장할 디렉토리를 만듭니다.
3.3. Zookeeper 설정 파일 수정
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
vi /usr/local/zookeeper/conf/zoo.cfg
아래 내용을 추가합니다.
server.1 = master1:2888:3888
server.2 = worker1:2888:3888
server.3 = worker2:2888:3888
Zookeeper 클러스터를 구성하기 위해 3개의 서버 정보를 추가합니다.
4. 컨테이너 이미지 저장 및 종료
컨테이너를 종료하고, 현재 상태를 Docker 이미지로 저장합니다.
exit
docker commit -m "hadoop,zookeeper install in ubuntu" hadoop-base ubuntu:hadoop
이제 저장한 ubuntu:hadoop 이미지를 활용하여 Hadoop 클러스터를 배포할 수 있습니다.
즉, 이 이미지를 기반으로 세 개의 컨테이너를 생성하여,
1개 컨테이너는 마스터 노드 (master1),
2개 컨테이너는 워커 노드 (worker1, worker2)
로 구성할 것입니다.
5. 컨테이너 생성 및 실행
docker run -dit --name master1 --hostname master1 ubuntu:hadoop
docker run -dit --name worker1 --hostname worker1 ubuntu:hadoop
docker run -dit --name worker2 --hostname worker2 ubuntu:hadoop
각 옵션 설명:
- -d : 백그라운드에서 컨테이너 실행
- -i -t : 인터랙티브 터미널 모드
- --name : 컨테이너 이름 설정 (master1, worker1, worker2)
- --hostname : 컨테이너 내부에서 사용할 호스트명 지정
6. 컨테이너에 접속하여 SSH 활성화
docker exec -it master1 bash
service ssh start
exit
docker exec -it worker1 bash
service ssh start
exit
docker exec -it worker2 bash
service ssh start
exit
Hadoop 클러스터 노드 간 SSH 접속이 필요하므로, 각 컨테이너에서 SSH 서비스를 실행합니다.
7. 컨테이너 간 SSH 접속 설정
Hadoop 클러스터에서 각 노드 간 원활한 통신을 위해 SSH 비밀번호 없이 접속할 수 있도록 설정해야 합니다. 이를 위해 각 컨테이너에서 SSH 키를 생성하고, 모든 컨테이너의 공개 키를 authorized_keys에 추가합니다.
7.1. SSH 키 생성
각 컨테이너(master1, worker1, worker2)에서 다음 명령어를 실행하여 SSH 키를 생성합니다.
ssh-keygen -t rsa
- -t rsa: RSA 알고리즘을 사용하여 키 생성
- 프롬프트가 나타나면 Enter 키를 눌러 기본 설정을 사용합니다.
7.2. 공개 키를 authorized_keys에 추가
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
이 명령어는 생성된 공개 키를 authorized_keys 파일로 복사하여 해당 컨테이너에서 SSH 접속을 허용합니다.
7.3. 각 컨테이너의 공개 키를 공유
각 컨테이너에서 다음 명령어를 실행하여 공개 키 내용을 확인합니다.
cat ~/.ssh/id_rsa.pub
출력된 내용을 복사하여 모든 컨테이너의 ~/.ssh/authorized_keys에 추가해야 합니다.
vi ~/.ssh/authorized_keys
다음과 같은 형식으로 각 노드의 공개 키를 추가합니다.
ssh-rsa AAAAB3... root@master1
ssh-rsa AAAAB3... root@worker1
ssh-rsa AAAAB3... root@worker2
AAAAB3... 부분은 각 컨테이너에서 cat ~/.ssh/id_rsa.pub로 얻은 공개 키 내용입니다
7.4. SSH 설정 적용
마지막으로 각 컨테이너에서 SSH 설정을 다시 로드합니다.
chmod 600 ~/.ssh/authorized_keys
service ssh restart
- chmod 600 : authorized_keys 파일의 보안 설정 조정
- service ssh restart : SSH 서비스를 재시작하여 변경 사항 적용
이제 각 컨테이너에서 다른 컨테이너로 비밀번호 없이 SSH 접속이 가능합니다.
예를 들어, master1에서 worker1로 SSH 접속을 테스트하려면 다음 명령어를 실행하면 됩니다.
ssh worker1
비밀번호를 입력하지 않고 정상적으로 접속된다면 설정이 완료된 것입니다
이제 마스터 노드와 워커 노드들의 환경 설정을 각각 진행하겠습니다.
8. 마스터 노드(master1) 설정
8.1. 환경 변수 수정
Hadoop 실행 시 네이티브 라이브러리 경로를 정확히 지정해야 합니다.
다음 명령어를 실행하여 .bashrc 파일을 수정합니다.
vi ~/.bashrc
다음 내용을 기존 HADOOP_OPTS 설정을 수정하여 추가합니다.
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
변경 사항 적용:
source ~/.bashrc
8.2. HDFS 데이터 디렉토리 생성
Hadoop Distributed File System(HDFS)에서 네임노드(Namenode)와 데이터노드(Datanode) 저장소를 생성합니다.
cd /usr/local/hadoop
mkdir -p hadoop_tmp/hdfs/namenode
mkdir -p hadoop_tmp/hdfs/datanode
chmod 777 hadoop_tmp/
- namenode : 파일 시스템의 메타데이터 저장
- datanode : 실제 데이터 블록 저장
8.3. Hadoop 환경 변수 설정
Hadoop 실행 시 필요한 사용자 계정 권한을 설정해야 합니다.
vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
다음 내용을 추가합니다.
export JAVA_HOME='/usr/lib/jvm/java-11-openjdk-amd64'
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_NODEMANAGER_USER=root
export YARN_RESOURCEMANAGER_USER=root
이 설정은 각 Hadoop 서비스가 root 사용자로 실행되도록 지정합니다.
8.4. HDFS 설정 (hdfs-site.xml)
HDFS의 복제 수와 데이터 저장 경로를 설정합니다.
vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml
다음 내용을 추가합니다.
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/hadoop_tmp/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/hadoop_tmp/hdfs/datanode</value>
</property>
</configuration>
- dfs.replication=3 : 데이터 블록을 3개 노드에 복제
- dfs.permissions=false : 권한 검사를 비활성화하여 설정 편의성 증가
- dfs.namenode.name.dir : 네임노드의 메타데이터 저장 경로
- dfs.datanode.data.dir : 데이터노드의 블록 저장 경로
9.워커 노드(worker1, worker2) 설정
9.1. HDFS 데이터 디렉토리 생성
각 워커 노드에서 데이터노드(Datanode) 저장소를 생성합니다.
cd /usr/local/hadoop
mkdir -p hadoop_tmp/hdfs/datanode
chmod 777 hadoop_tmp/
- 마스터 노드와 달리 네임노드 디렉토리는 생성하지 않음
9.2. Hadoop 환경 변수 설정
각 워커 노드에서 hadoop-env.sh 파일을 수정하여 Java 경로를 설정합니다.
vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
다음 내용을 추가합니다.
export JAVA_HOME='/usr/lib/jvm/java-11-openjdk-amd64'
9.3. HDFS 설정 (hdfs-site.xml)
각 워커 노드에서 데이터노드 설정을 추가합니다.
vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml
다음 내용을 추가합니다.
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/hadoop_tmp/hdfs/datanode</value>
</property>
</configuration>
- 마스터 노드와 동일한 설정을 적용하지만, 네임노드 설정은 포함하지 않음
10. Hadoop 네임노드 포맷 및 클러스터 시작
마스터 노드(master1)에 접속하여, 네임노드를 초기화합니다.
docker exec -it master1 bash
hdfs namenode -format
start-all.sh
✅ 마무리
이제 마스터 노드와 워커 노드의 환경이 모두 설정되었습니다.
다음 단계로 Hadoop 포맷팅 및 실행을 진행하면 클러스터가 정상적으로 작동할 것입니다.
'Backend' 카테고리의 다른 글
Apache Spark 설치 및 HBase 연동하기 (0) | 2025.02.19 |
---|---|
HBase 데이터 구조 및 테이블 생성부터 테스트까지 (0) | 2025.02.11 |
Hadoop 클러스터에 HBase 설치 및 설정 (0) | 2025.02.10 |