2026. 3. 16. 00:27ㆍ📚 빅데이터 분산
빅데이터 분산 처리 프로젝트 - On My Guide Docker 인프라 세팅
프로젝트 개요
외국인 관광객을 위한 여행지 추천 시스템의 백엔드를 개발하는 프로젝트다.
사용자 행동 로그를 수집하고, 빅데이터 분산 처리를 통해 "나와 비슷한 여행자들의 선호 여행지"를 분석하여 추천하는 것이 목표다.
기술 스택
- Java 17 / Spring Boot 3.0.5 / Spring Security 6
- PostgreSQL — 분석 결과 저장용 RDB
- Hadoop (HDFS) — 대용량 사용자 로그 적재
- Spark — 배치 분산 처리 (군집 분석)
- Kafka — 로그 이벤트 스트리밍
전체 데이터 파이프라인
사용자 행동 (GO, 상세보기, 재추천)
↓
Kafka (로그 이벤트 스트림)
↓
Spring Consumer (Kafka 메시지 수신)
↓
HDFS (사용자 로그 적재)
↓
Spark 배치 처리 (새벽 4시, 군집 분석)
↓
PostgreSQL (분석 결과 저장)
↓
조회 API → 클라이언트에 추천 장소 반환왜 Docker를 사용하는가?
이 프로젝트에는 PostgreSQL, Hadoop, Spark, Kafka 등 여러 인프라가 필요하다.
이걸 하나하나 로컬에 직접 설치하면 버전 충돌, 환경 차이, 삭제 시 찌꺼기 등의 문제가 발생한다.
Docker는 각 프로그램을 격리된 컨테이너에서 실행하는 도구다.
Docker Compose는 여러 컨테이너를 docker-compose.yml 파일 하나로 관리할 수 있게 해준다.
docker-compose up -d # 전부 실행
docker-compose down # 전부 종료
💡
docker-compose.yml을 수정한 뒤docker-compose up -d를 다시 실행하면,
변경된 컨테이너만 재시작되고 기존 컨테이너는 유지된다.
1. PostgreSQL 컨테이너 세팅
가장 먼저 분석 결과를 저장할 PostgreSQL을 띄웠다.
docker-compose.yml (PostgreSQL만)
services:
postgres:
image: postgres:15
container_name: travel-postgres
ports:
- "5432:5432"
environment:
POSTGRES_DB: travel_db
POSTGRES_USER: admin
POSTGRES_PASSWORD: admin1234
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
주요 설정 설명
| 항목 | 설명 |
|---|---|
image: postgres:15 |
PostgreSQL 15 버전 이미지 사용 |
ports: "5432:5432" |
호스트의 5432 포트를 컨테이너의 5432 포트에 매핑. Spring Boot에서 localhost:5432로 접속 가능 |
environment |
DB 이름, 사용자, 비밀번호를 환경변수로 설정. 컨테이너 최초 실행 시 자동 생성됨 |
volumes |
컨테이너를 종료해도 데이터가 유지되도록 볼륨 마운트 |
동작 확인
# 실행
docker-compose up -d
# PostgreSQL 접속
docker exec -it travel-postgres psql -U admin -d travel_db
# 데이터베이스 목록 확인
\l
# 종료
\q
travel_db가 목록에 표시되면 성공이다.
2. Hadoop (HDFS) 컨테이너 세팅
사용자 로그를 대량으로 적재할 HDFS를 추가했다.
HDFS란?
HDFS(Hadoop Distributed File System)는 대용량 파일을 분산 저장하는 파일 시스템이다.
두 가지 역할로 구성된다.
- NameNode — 파일이 어디에 저장되어 있는지 관리하는 메타데이터 서버 (전화번호부 역할)
- DataNode — 실제 데이터가 저장되는 스토리지 노드 (창고 역할)
docker-compose.yml에 추가
namenode:
image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
container_name: travel-namenode
ports:
- "9870:9870"
- "9000:9000"
environment:
CLUSTER_NAME: travel-cluster
CORE_CONF_fs_defaultFS: hdfs://namenode:9000
volumes:
- namenode_data:/hadoop/dfs/name
datanode:
image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
container_name: travel-datanode
depends_on:
- namenode
environment:
SERVICE_PRECONDITION: "namenode:9870"
CORE_CONF_fs_defaultFS: hdfs://namenode:9000
volumes:
- datanode_data:/hadoop/dfs/data
주요 설정 설명
| 항목 | 설명 |
|---|---|
9870 포트 |
Hadoop 웹 관리 화면 (http://localhost:9870) |
9000 포트 |
HDFS 파일 읽기/쓰기용 포트 (Spring Boot, Spark에서 사용) |
CORE_CONF_fs_defaultFS |
HDFS의 기본 파일시스템 주소 설정. 이 설정이 없으면 Windows 환경에서 경로 인식 에러 발생 |
depends_on |
DataNode는 NameNode가 먼저 실행된 후에 시작 |
SERVICE_PRECONDITION |
NameNode가 완전히 준비될 때까지 DataNode가 대기 |
동작 확인
# 실행
docker-compose up -d
# 웹 브라우저에서 확인
# http://localhost:9870 접속 → Hadoop Overview 화면이 뜨면 성공
# HDFS에 테스트 파일 저장
docker exec -it travel-namenode bash -c "echo 'hello hdfs' > /tmp/test.txt && hdfs dfs -mkdir -p /test && hdfs dfs -put /tmp/test.txt /test/"
# 파일 확인
docker exec -it travel-namenode hdfs dfs -ls hdfs://namenode:9000/test/
⚠️ Windows Git Bash 사용 시 주의
Git Bash는
/를 Windows 경로(C:\)로 자동 변환하는 이슈가 있다.hdfs dfs -ls /명령어 실행 시No FileSystem for scheme "C"에러가 발생하면,
전체 HDFS 주소를 명시하면 된다.# 에러 발생 docker exec -it travel-namenode hdfs dfs -ls / # 해결 방법 1: 전체 주소 명시 docker exec -it travel-namenode hdfs dfs -ls hdfs://namenode:9000/ # 해결 방법 2: 경로 변환 비활성화 MSYS_NO_PATHCONV=1 docker exec -it travel-namenode hdfs dfs -ls /
3. Spark 컨테이너 세팅
HDFS에 적재된 로그 데이터를 분석할 Spark를 추가했다.
Spark란?
Spark는 대용량 데이터를 여러 노드에서 병렬로 분석하는 분산 처리 엔진이다.
이 프로젝트에서는 매일 새벽 4시에 HDFS의 사용자 로그를 읽어 군집 분석(성별, 나이, 국적 기반 그룹핑)을 수행한다.
- Master — 작업을 분배하는 관리 노드
- Worker — 실제 연산을 수행하는 실행 노드
docker-compose.yml에 추가
spark-master:
image: bde2020/spark-master:3.1.1-hadoop3.2
container_name: travel-spark-master
ports:
- "8080:8080"
- "7077:7077"
environment:
CORE_CONF_fs_defaultFS: hdfs://namenode:9000
spark-worker:
image: bde2020/spark-worker:3.1.1-hadoop3.2
container_name: travel-spark-worker
depends_on:
- spark-master
environment:
SPARK_MASTER: spark://spark-master:7077
CORE_CONF_fs_defaultFS: hdfs://namenode:9000
주요 설정 설명
| 항목 | 설명 |
|---|---|
8080 포트 |
Spark 웹 관리 화면 (http://localhost:8080) |
7077 포트 |
Master-Worker 간 내부 통신 포트 |
SPARK_MASTER |
Worker에게 Master의 주소를 알려주는 설정 |
CORE_CONF_fs_defaultFS |
Spark가 HDFS에 접근할 수 있도록 주소 설정 |
동작 확인
# 실행
docker-compose up -d
# 컨테이너 상태 확인 (5개 모두 Up 상태여야 함)
docker ps
# 웹 브라우저에서 확인
# http://localhost:8080 접속 → Spark Master 화면에서 Workers(1) 확인
Status가 ALIVE이고 Workers가 1로 표시되면 성공이다.
최종 docker-compose.yml
services:
postgres:
image: postgres:15
container_name: travel-postgres
ports:
- "5432:5432"
environment:
POSTGRES_DB: travel_db
POSTGRES_USER: admin
POSTGRES_PASSWORD: admin1234
volumes:
- postgres_data:/var/lib/postgresql/data
namenode:
image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
container_name: travel-namenode
ports:
- "9870:9870"
- "9000:9000"
environment:
CLUSTER_NAME: travel-cluster
CORE_CONF_fs_defaultFS: hdfs://namenode:9000
volumes:
- namenode_data:/hadoop/dfs/name
datanode:
image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
container_name: travel-datanode
depends_on:
- namenode
environment:
SERVICE_PRECONDITION: "namenode:9870"
CORE_CONF_fs_defaultFS: hdfs://namenode:9000
volumes:
- datanode_data:/hadoop/dfs/data
spark-master:
image: bde2020/spark-master:3.1.1-hadoop3.2
container_name: travel-spark-master
ports:
- "8080:8080"
- "7077:7077"
environment:
CORE_CONF_fs_defaultFS: hdfs://namenode:9000
spark-worker:
image: bde2020/spark-worker:3.1.1-hadoop3.2
container_name: travel-spark-worker
depends_on:
- spark-master
environment:
SPARK_MASTER: spark://spark-master:7077
CORE_CONF_fs_defaultFS: hdfs://namenode:9000
volumes:
postgres_data:
namenode_data:
datanode_data:
관리 대시보드 접속 정보
| 서비스 | URL | 용도 |
|---|---|---|
| Hadoop HDFS | http://localhost:9870 |
HDFS 상태 및 파일 시스템 모니터링 |
| Spark Master | http://localhost:8080 |
Spark 작업 상태 및 Worker 모니터링 |
| PostgreSQL | localhost:5432 |
DB 클라이언트 접속 (DBeaver 등) |
재밌다 빅데이터 분산하길 잘했다.
'📚 빅데이터 분산' 카테고리의 다른 글
| [특화 프로젝트] 추천 장소 조회 API 개발 (3) | 2026.03.16 |
|---|---|
| [특화 프로젝트] Spark 배치 분석 및 결과 저장 (0) | 2026.03.16 |
| [특화 프로젝트] HDFS에 사용자 로그 적재 (0) | 2026.03.16 |
| [특화 프로젝트] Spring Boot 프로젝트 생성 및 PostgreSQL 연동 (2) | 2026.03.16 |