LINE Ads, Spark on Kubernetes 도입으로 데이터 파이프라인 성능 226% 향상!

by DD
2개월 전
조회수 44

LINE Ads는 대규모 광고 데이터 처리를 위해 기존 Hadoop YARN 환경의 자원 경합, 운영 비용, 의존성 문제를 겪음

Spark on Kubernetes 도입을 통해 인프라 독립성 확보, 컨테이너 기반 유연한 환경 구축, 226% 성능 향상40% 비용 절감 달성

Kubernetes 환경에서 Spark 드라이버/익스큐터 파드 실행, 클러스터 모드 활용, YuniKorn 스케줄러를 통한 자원 관리

메모리 오버헤드(Memory Overhead), 노드/파드 실패 시 데이터 유실 등 트러블슈팅(Troubleshooting) 경험 공유

향후 Iceberg 등 다양한 기술 도입을 통해 데이터 활용성 극대화 및 데이터 플랫폼(Data Platform) 고도화 계획

Spark on Kubernetes 아키텍처 심층 분석

LINE Ads는 Spark on Kubernetes를 통해 기존 YARN 환경의 한계를 극복하고, 유연하고 효율적인 데이터 처리 환경을 구축했다. Spark 애플리케이션은 Kubernetes 파드(Pod) 내에서 드라이버(Driver)와 익스큐터(Executor)로 실행되며, Kubernetes 스케줄러가 리소스 관리를 담당한다. 특히, 클러스터 모드를 활용하여 Kubernetes 클러스터에 리소스를 위임하고, GitHub ActionsArgoCD를 통해 배포 자동화를 구현했다. 이러한 아키텍처는 인프라 독립성을 확보하고, 다양한 스토리지(S3, GCS, HDFS)를 유연하게 선택할 수 있게 한다. 또한, 멀티 워크로드 통합(Multi-Workload Integration)을 통해 데이터 플랫폼의 통합을 가능하게 했다.

YARN vs Kubernetes: 자원 관리 방식 비교

기존 YARN 환경은 Hadoop 스토리지와 컴퓨팅 자원이 단일 노드에 결합되어 자원 경합(Contention)이 발생하고, Hadoop 노드 증설에 따른 운영 비용 증가 및 HDFS 의존성(HDFS Dependency) 문제를 야기했다. 반면, Spark on Kubernetes는 컨테이너 기반 실행을 통해 환경 재현성을 높이고, 오토 스케일링(Auto-scaling)을 지원하여 유연한 자원 관리를 가능하게 한다. YARN은 Hadoop 에코시스템에 종속적이었지만, Kubernetes는 다양한 워크로드 통합을 지원하며, 팀별 네임스페이스(Namespace) 분리, 리소스 쿼터(ResourceQuota) 설정, RBAC 기반 권한 제어를 통해 유연한 운영 거버넌스를 제공한다. 이러한 차이점은 Spark 애플리케이션의 성능 향상과 비용 절감에 기여했다.

Apache YuniKorn을 활용한 스케줄링 최적화

LINE Ads는 Spark on Kubernetes 환경에서 Apache YuniKorn을 스케줄러로 선택하여 자원 관리 효율성을 극대화했다. YuniKorn은 배치 잡 스케줄링을 담당하며, Kubernetes 환경에서 자원 조정과 갱(Gang) 스케줄링을 지원한다. 특히, 갱 스케줄링은 잡에 필요한 모든 자원이 할당될 때까지 작업을 대기시켜 자원 부족으로 인한 작업 실패(Job Failure)를 방지한다. 또한, 계층적 자원 큐(Hierarchical Resource Queue)를 통해 테넌트별 자원 제어를 가능하게 하며, 애플리케이션 인식(Application-aware) 스케줄링을 통해 다양한 스케줄링 방식을 지원한다. 이러한 기능들은 Spark 잡의 안정적인 실행과 성능 향상에 기여하며, 데이터 파이프라인의 효율성을 높이는 데 중요한 역할을 한다.

Spark on Kubernetes 환경의 트러블슈팅 경험

Spark on Kubernetes 환경에서 LINE Ads는 다양한 트러블슈팅(Troubleshooting) 경험을 공유한다. 특히, 메모리 오버헤드(Memory Overhead) 문제 해결을 위해 익스큐터 메모리 오버헤드를 기존 익스큐터 메모리의 0.1에서 0.2 이상으로 추가 할당했다. 또한, 노드 및 파드 실패 시 데이터 유실을 방지하기 위해 emptyDirPVC(Persistent Volume Claim) 볼륨 종류에 따른 작동 방식을 분석하고, 잡 재시도(Job Retries) 전략을 수립했다. 드라이버 파드(Driver Pod) 종료 시 앱 종료, 익스큐터 파드(Executor Pod)의 볼륨 종류에 따른 데이터 처리 방식 등, Kubernetes 환경에서의 Spark 애플리케이션 운영 노하우를 공유한다.

Spark on Kubernetes 도입 효과: 성능 및 비용 절감

Spark on Kubernetes 도입을 통해 LINE Ads는 괄목할 만한 성과를 거두었다. 스트리밍 잡(Streaming Job)에서 226%의 성능 향상을 달성했으며, 컴퓨팅 자원 기준 연간 비용을 40% 이상 절감했다. 이러한 성과는 Hadoop 연산 병행을 제거하고, 컴퓨팅 자원에 집중하여 단일 CPU의 처리 성능을 향상시킨 결과이다. 또한, 다양한 Spark 버전 및 의존성 환경을 유연하게 운영할 수 있게 되었으며, Spark Connect 기능을 활용하여 다양한 환경에서 Spark 잡을 호출할 수 있게 되었다. 이러한 변화는 데이터 활용성을 극대화하고, 데이터 플랫폼을 고도화하는 데 기여했다.

LINE 서비스의 대규모 광고 데이터를 처리하기 위한 Spark on Kubernetes 적용기