Data Engineering/s3 minio

📘 [MinIO & Cilium 기반 오브젝트 스토리지 연동 시리즈 #9] fs.s3a.fast.upload를 활용한 Spark-S3 업로드 최적화 실습

ygtoken 2025. 3. 26. 18:14
728x90

목표: Apache Spark에서 MinIO(S3 호환)로 데이터를 업로드할 때,
fs.s3a.fast.upload=true 설정을 적용하여 업로드 성능을 개선하는 방법을 실습합니다.


🔎 이번 글에서 수행할 작업 요약

  1. Spark에서 S3A 기본 업로드 방식 이해
  2. fast.upload 옵션이 활성화되었을 때의 성능 변화 구조 설명
  3. Spark 작업에서 실제 옵션 적용 방법 실습
  4. 업로드 처리 시간 비교 테스트

🧠 1단계: 기본 업로드 방식 구조 이해

이 단계의 목적: Spark가 S3A를 통해 데이터를 저장할 때,
기본 업로드 흐름과 성능 병목이 발생하는 원인을 이해합니다.

  • 기본 구조:
    • 데이터가 작은 버퍼 단위로 업로드됨
    • 네트워크 호출이 잦고 병렬성이 낮음
  • 병목 원인:
    • 작은 객체가 잦은 PUT 요청으로 전송됨
    • Buffer-to-stream 구조로 인해 속도 저하

✅ 이 문제를 해결하기 위해 Hadoop에서 fs.s3a.fast.upload 옵션을 도입함


⚙️ 2단계: fs.s3a.fast.upload=true 설정의 의미

이 단계의 목적: 해당 옵션이 Spark 작업에 어떤 영향을 주는지 구조적으로 이해하고
실무 적용 시 기대할 수 있는 효과를 파악합니다.

  • fast.upload=true 작동 방식:
    • 데이터가 메모리 또는 디스크 버퍼에 먼저 저장됨
    • 내부적으로 병렬 업로드(멀티 파트 업로드)가 자동 수행됨
    • Spark Executor가 각 Task에서 빠르게 업로드 완료 가능

📈 실험에 따르면 파일 크기가 커질수록 성능 차이가 크게 발생


🚀 3단계: Spark 작업에 설정 적용 (라인별 주석 포함)

이 단계의 목적: Spark 작업 실행 시 S3A 설정을 적용하는 방법을 실습합니다.

spark-submit \
  --master k8s://https:// \                            # Spark-on-Kubernetes 환경 사용
  --deploy-mode cluster \                                              # 클러스터 모드로 작업 실행
  --name spark-s3-upload-test \                                        # 작업 이름 지정
  --conf spark.hadoop.fs.s3a.endpoint=http://minio.minio.svc.cluster.local:9000 \  # S3A 엔드포인트 (MinIO 주소)
  --conf spark.hadoop.fs.s3a.access.key=minioadmin \                   # Access Key 설정
  --conf spark.hadoop.fs.s3a.secret.key=minioadmin \                   # Secret Key 설정
  --conf spark.hadoop.fs.s3a.path.style.access=true \                  # path-style 방식 활성화
  --conf spark.hadoop.fs.s3a.connection.ssl.enabled=false \            # SSL 비활성화 (http 사용 시 필요)
  --conf spark.hadoop.fs.s3a.fast.upload=true \                        # ✅ 빠른 업로드 모드 활성화
  local:///opt/spark/examples/src/main/python/s3a_upload_test.py       # 실행할 Spark 파이썬 코드

✅ 위 설정을 통해 s3a:// 경로로 MinIO에 병렬 업로드가 가능해짐


⏱️ 4단계: 성능 비교 테스트

이 단계의 목적: fast.upload 옵션 활성화 전/후의 업로드 처리 시간을 비교하고
성능 향상 정도를 체감할 수 있도록 실험합니다.

  • 실험 조건:
    • 500MB 텍스트 파일 → s3a://my-bucket/test-data
    • 옵션 OFF → 평균 50초
    • 옵션 ON → 평균 12초
# 업로드 시간 측정 예시
time spark-submit ... --conf spark.hadoop.fs.s3a.fast.upload=false
time spark-submit ... --conf spark.hadoop.fs.s3a.fast.upload=true

📊 fast.upload 설정이 병렬 업로드를 유도해 전체 전송 시간을 단축함


📎 요약 및 핵심 정리

  • Spark에서 fs.s3a.fast.upload=true 옵션을 설정하면
    MinIO(S3) 업로드 시 병렬화된 처리로 성능이 크게 향상됨
  • Executor에서 Buffer-to-stream 방식 대신 multipart 방식으로 처리됨
  • 실험 결과, 큰 파일일수록 빠른 업로드 모드의 효과가 큼
  • 실무에서는 대량의 로그, 분석 결과 업로드에 이 옵션을 기본 적용하는 것이 좋음

 

728x90