-
Hadoop의 개념 및 도커로 클러스터 구성하기환경 구축 2025. 1. 5. 17:08
Apache Hadoop
Apache Hadoop은 데이터의 규모가 기가바이트에서 페타바이트에 이르는 대규모 데이터 세트를 효율적으로 저장 및 처리하는 데 사용되는 오픈 소스 프레임워크입니다.
성능 좋은 대용량 컴퓨터 한대를 사용하기 보다는, 여러 대의 컴퓨터를 사용해 대량의 데이터를 병렬적으로 처리하는 방식입니다.
Hadoop의 구성 요소
하둡은 크게 세가지 구성 요소가 있습니다.
HDFS : Hadoop Distributed File System으로, 말그대로 하둡의 분산 파일 시스템입니다. 데이터를 저장하는 곳으로, 하드디스크같은 것입니다.
Yarn : Hadoop의 리소스를 관리하고, 스케줄링을 합니다.
Map Reduce : 데이이터를 병렬적으로 계산하는 프레임워크입니다. 맵 테스크는 데이터를 가져오고, 리듀스 테스크는 데이터를 집계합니다.
쉽게 말해 HDFS는 저장, Yarn은 관리, MapReduce는 처리입니다.

HDFS (Hadoop Distribution File System)
HDFS는 분산 파일 시스템으로, Java 기반 프레임워크입니다.
HDFS은 NameNode 1대와 DataNode 여러대로 구성된 마스터 슬레이브 구조입니다.
NameNode
NameNode는 파일 정보 즉, 메타 데이터를 관리합니다. 메타 데이터 관리는 디스크가 아닌 메모리에서 이루어지기 때문에 빠른 응답이 가능합니다.
또한 NameNode는 DataNode의 다운 여부를 감시하고, 스케줄링을 합니다.
DataNode
DataNode는 데이터를 블록으로 쪼개 저장하는 역할을 합니다. 실질적인 데이터 저장소라고 할 수 있습니다. 자신의 상태를 NameNode에 보고하며 hearbeat 체크를 합니다.
NameNode는 hearbeat가 이루어지지 않을 경우 해당 DataNode를 장애로 판단하고, 대체할 다른 DataNode를 생성합니다.
Yarn
'Yet Another Resource Negotiator' 의 줄임말입니다. 번역해보자면, '또 다른 리소스 협상' 이라고 할 수 있습니다.
Yarn은 이름의 뜻 처럼 리소스를 협상하고 관리하고 또 스케줄링하는 Hadoop의 컴포넌트입니다.
HDFS에는 NameNode, DataNode 말고도 JobTracker, Task Tracker가 있는데요, Yarn이 등장하기 전 버전에서는 Job Tracker가 중앙관리를 맡았습니다. 하지만 데이터가 커지면서, Job Tracker에 병목현상이 발생 위험이 커졌습니다.
그래서 Yarn이 등장을 합니다. Job Tracker의 역할을 분배해서 리소스 관리를 Yarn이 하게 된 것입니다.
MapReduce
맵리듀스 프로그래밍 모델은 Map과 Reduce라는 크게 2가지 단계로 데이터를 처리합니다. 맵은 입력 파일을 한 줄씩 읽어 데이터를 변형(Transformation)하며 리듀스는 맵의 결과 데이터를 집계(Aggregation)합니다.
HDFS는 디스크에 데이터가 저장되는데요, MapRedue는 이 디스크에서 데이터를 가져와 데이터를 계산합니다. 때문에 계산 속도는 빠르지만, 데이터를 꺼내고 집어넣는 과정이 계산보다 더 오래걸린다는 단점이 있었습니다. 그래서 등장한게 Spark입니다.
Spark는 메모리 기반으로 동작하기 때문에 MapReduce의 단점을 해결해주었습니다.
Spark에 관한 글은 다음 포스팅에서 다루겠습니다.
Hadoop cluster 구성하기
Dockerfile
# ubuntu 이미지 기반 FROM ubuntu:20.04 # 필요한 패키지 설치 RUN apt-get update RUN apt-get -y install openjdk-11-jdk wget curl rsync RUN apt-get clean # -> 패키지 설치 후 남아 있는 캐시 데이터를 제거 # 하둡 버전 환경변수에 저장 ENV HADOOP_VERSION=3.3.5 # 하둡의 설치 디렉터리를 환경 변수에 저장 ENV HADOOP_HOME=/usr/local/hadoop # 자바 설치 경로 환경 변수에 저장 ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64 # bin 및 sbin 디렉터리를 환경변수에 저장 -> Hadoop 명령어를 어디서든 사용할 수 있게 ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin # 하둡 다운로드 및 압축 해제 RUN wget https://dlcdn.apache.org/hadoop/common/hadoop-$HADOOP_VERSION/hadoop-$HADOOP_VERSION.tar.gz RUN tar -zxvf hadoop-$HADOOP_VERSION.tar.gz RUN mv hadoop-$HADOOP_VERSION /usr/local/hadoop RUN rm hadoop-$HADOOP_VERSION.tar.gz # HDFS와 관련된 설정(예: 기본 파일 시스템 경로)을 정의 COPY core-site.xml $HADOOP_HOME/etc/hadoop/core-site.xml # HDFS 노드의 블록 크기, 복제 수 등의 설정을 정의 COPY hdfs-site.xml $HADOOP_HOME/etc/hadoop/hdfs-site.xml EXPOSE 9870 9864 8088 9000 # 9870: HDFS 웹 UI 포트 (NameNode 관리 페이지). # 9864: HDFS DataNode 서비스 포트. # 8088: YARN ResourceManager UI 포트. # 9000: HDFS NameNode의 RPC 포트. CMD ["/bin/bash"]docker-compose
networks: hadoop-spark-network: external: true # 외부 네트워크 사용 services: namenode: image: qufdl/my-hadoop:1.0 container_name: namenode hostname: namenode networks: - hadoop-spark-network volumes: - ./hdfs/namenode:/usr/local/hadoop/hdfs/namenode ports: # HDFS 웹 UI 포트 (NameNode 관리 페이지). - "9870:9870" # 9000: HDFS NameNode의 RPC 포트. - "9000:9000" # namenode 컨테이너가 시작될 때 HDFS NameNode를 포맷하고 그 다음에 NameNode를 실행하는 명령어 command: "/bin/bash -c 'hdfs namenode -format && hdfs namenode'" datanode-1: image: qufdl/my-hadoop:1.0 container_name: datanode-1 hostname: datanode-1 networks: - hadoop-spark-network volumes: - ./hdfs/namenode:/usr/local/hadoop/hdfs/namenode ports: # 9864: HDFS DataNode 서비스 포트. - "9861:9864" - "9001:9000" # 컨테이너가 시작될 때 HDFS DataNode를 실행 command: ["hdfs", "datanode"] datanode-2: image: qufdl/my-hadoop:1.0 container_name: datanode-2 hostname: datanode-2 networks: - hadoop-spark-network volumes: - ./hdfs/datanode:/mnt/hadoop/hdfs/datanode ports: - "9862:9864" - "9002:9000" command: ["hdfs", "datanode"] datanode-3: image: qufdl/my-hadoop:1.0 container_name: datanode-3 hostname: datanode-3 networks: - hadoop-spark-network volumes: - ./hdfs/datanode:/mnt/hadoop/hdfs/datanode ports: - "9863:9864" - "9003:9000" command: ["hdfs", "datanode"]'환경 구축' 카테고리의 다른 글
Spark 개념, docker로 cluster 환경 구축하기 (2) 2025.01.12 docker로 elk환경 세팅하기 (1) 2024.11.01 k8s에 Logstash 환경 구축하기 (1) 2024.10.28 k8s에 Elasticsearch 환경 구축하기 (1) 2024.10.14 서버 이중화(6) - Clustering 클러스터링 / Galera (1) 2024.05.29