
YARN의 한계를 깨고 성능 226% 향상과 비용 40% 절감을 동시에 달성한 대규모 데이터 엔진 전환기
폭증하는 광고 데이터 처리를 위해 기존 Hadoop 기반 인프라에서 Kubernetes 환경으로 Spark 엔진을 성공적으로 이전한 여정을 담고 있습니다. 자원 경합과 확장성 문제를 해결하기 위해 선택한 아키텍처와 Apache YuniKorn 스케줄러의 활용법, 그리고 실제 운영 과정에서 겪은 메모리 최적화 트러블슈팅 경험을 공유합니다.
Hadoop 클러스터의 노후화나 운영 비용 문제로 고민 중인 데이터 엔지니어에게 필독을 권합니다. 특히 Spark 워크로드를 K8s로 마이그레이션할 때 반드시 고려해야 할 메모리 설정과 스케줄링 전략에 대한 실전 가이드를 제공합니다.
기존 Hadoop/YARN 환경은 스토리지와 컴퓨팅 자원이 단일 노드에 결합되어 있어 자원 경합에 따른 성능 저하가 발생했으며, 리소스 확장 시 불필요한 스토리지 증설이 동반되는 비효율이 존재했습니다. 또한 Spark 버전이나 JVM 환경이 Hadoop 노드에 종속되어 있어 최신 기능을 유연하게 도입하기 어려운 구조적 한계가 있었습니다.
Spark on Kubernetes(Cluster Mode)를 도입하여 인프라 독립성을 확보하고, 배치 잡의 효율적인 리소스 할당을 위해 Apache YuniKorn의 갱(Gang) 스케줄링을 적용했습니다. CI/CD 파이프라인은 GitHub Actions와 ArgoCD를 통해 자동화하였으며, 메모리 오버헤드 이슈를 해결하기 위해 오프힙(Off-heap) 메모리 비중을 상향 조정했습니다.
스트리밍 잡 기준 기존 대비 절반의 코어만 사용하고도 처리 성능이 약 226% 향상되었으며, 컴퓨팅 자원 기준 연간 운영 비용을 40% 이상 절감했습니다. 또한 환경 의존성 문제를 해결하여 다양한 Spark 버전을 독립적으로 운영할 수 있는 유연한 데이터 플랫폼을 구축했습니다.
Trade-off
Spark on Kubernetes 환경에서는 JVM 외부 연산량이 많아 기존 YARN 대비 더 높은 메모리 오버헤드 설정이 필요하여 자원 설계 시 주의가 필요합니다. 또한 익스큐터 파드 실패 시 로컬 디스크에 저장된 캐시 데이터가 유실될 수 있어, 작업 성격에 따라 PVC(Persistent Volume Claim) 도입과 같은 관리 복잡도가 수반됩니다.
Kubernetes 환경에서 배치 워크로드를 효율적으로 관리하기 위해 설계된 범용 리소스 스케줄러입니다.
익스큐터의 JVM 온힙 메모리 외에 Netty 통신이나 Parquet 직렬화 등에서 사용하는 추가적인 오프힙(Off-heap) 메모리 영역입니다.
하나의 작업에 필요한 모든 리소스를 동시에 할당하거나, 하나라도 부족하면 실행하지 않고 대기시키는 스케줄링 방식입니다.




