본문 바로가기

교육

Data Lake Windows 환경에서의 현실적 권장 아키텍처

반응형
[ Data Source ]
  └ CSV / JSON / Excel / API
          ↓
[ Ingestion ]
  └ Apache NiFi (or Python ETL)
          ↓
[ Object Storage ]
  └ MinIO (S3 Compatible)
          ↓
[ Table Format ]
  └ Apache Iceberg
          ↓
[ Query / Processing ]
  └ Trino (or Presto)
          ↓
[ BI / API ]
  └ Superset / FastAPI

 

2. 필수 오픈소스 구성 요소 및 역할

계층오픈소스역할
Storage MinIO S3 호환 Object Storage
Table Apache Iceberg ACID, Snapshot 기반 Data Lake 테이블
SQL Engine Trino 분산 SQL Query Engine
Metadata Hive Metastore 테이블 메타데이터 관리
ETL Python / NiFi 데이터 수집·정제
API FastAPI 서비스 API
BI Apache Superset 데이터 시각화

✅ 모두 Windows + Docker 환경에서 실행 가능

 

 

3. 사전 준비 (Windows)

3.1 필수 설치

  • Windows 10/11 Pro
  • WSL2 활성화
  • Docker Desktop (WSL2 backend)
  • Git
  • Python 3.10+

 

4. 단계별 구축 가이드

STEP 1. Docker 기반 기본 인프라 구성

docker-compose.yml (핵심)

version: "3.8"
services:
  minio:
    image: minio/minio
    container_name: minio
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: admin123
    command: server /data --console-address ":9001"

  metastore:
    image: apache/hive:3.1.3
    container_name: hive-metastore
    environment:
      SERVICE_NAME: metastore
    ports:
      - "9083:9083"

  trino:
    image: trinodb/trino
    container_name: trino
    ports:
      - "8080:8080"

 

STEP 2. MinIO 버킷 생성


STEP 3. Iceberg + Trino 연동

Trino Catalog 설정 (iceberg.properties)

connector.name=iceberg
iceberg.catalog.type=hive
hive.metastore.uri=thrift://hive-metastore:9083
fs.s3a.endpoint=http://minio:9000
fs.s3a.access.key=admin
fs.s3a.secret.key=admin123
fs.s3a.path.style.access=true
 
 

 

STEP 4. 데이터 적재 (Python ETL)

import pandas as pd
import boto3

s3 = boto3.client(
    "s3",
    endpoint_url="http://localhost:9000",
    aws_access_key_id="admin",
    aws_secret_access_key="admin123"
)

df = pd.read_csv("sample.csv")
df.to_parquet("sample.parquet")

s3.upload_file(
    "sample.parquet",
    "raw",
    "sample.parquet"
)

 

STEP 5. Iceberg 테이블 생성

CREATE SCHEMA iceberg.demo;

CREATE TABLE iceberg.demo.orders (
  order_id BIGINT,
  amount DOUBLE,
  created_at TIMESTAMP
)
WITH (
  format = 'PARQUET',
  location = 's3a://iceberg/orders'
);

 

STEP 6. API 서비스 연동 (FastAPI)

from fastapi import FastAPI
import trino

app = FastAPI()

conn = trino.dbapi.connect(
    host="localhost",
    port=8080,
    user="admin",
    catalog="iceberg",
    schema="demo"
)

@app.get("/orders")
def get_orders():
    cur = conn.cursor()
    cur.execute("SELECT * FROM orders LIMIT 10")
    return cur.fetchall()

 

5. 로컬 환경에서 가능한 서비스 시나리오

  • 사내 데이터 분석 PoC
  • 공공 데이터 통합 분석 서비스
  • 제조/물류 이력 분석
  • 로그·이벤트 기반 통계 서비스
  • AI 학습용 데이터 레이크 전처리

 

 

 

반응형