데이터 처리를 한다면 아마 대부분 Pandas로 시작하리라 믿는다. 작은 데이터를 빠르게 처리하는데는 이만한 것이 없지만 데이터의 크기가 커지면 처리하는데 두 가지 문제가 생긴다:
1️⃣ 처리가 너무 오래 걸리는 이슈 (Pandas는 Single Thread라는 치명적인 문제 존재)
2️⃣ 아예 데이터 자체를 적재하지 못하는 이슈 (Pandas는 데이터를 메모리에 적재해야함)
이 때부터 Spark이란 빅데이터 프로세싱 프레임워크의 도입이 필요해지는데 프로그래밍 패러다임만 놓고 보면 Pandas와 Spark은 크게 다르지 않다. Spark 역시 DataFrame으로 데이터 처리를 하기 때문이다. Spark Session이란 거를 앞단에 만들어야 하는 것과 DataFrame 함수가 다르다는 점을 빼고는 프로그래밍 관점에서는 큰 차이가 없다. 다르게 이야기하면 Pandas에서 Spark으로 내 스킬을 확장하는 건 생각처럼 힘들지 않다. 기본적으로 Spark은 Pandas on Steroids라 할 수 있다.
Spark 데이터 처리의 기본
Spark 프로그래밍은 어떤 부분에 복잡해질까? 기본적으로 Spark은 큰 데이터를 Partition이라 부르는 블록으로 나눈 다음 이를 다수의 Task들로 처리하여 큰 데이터를 병렬처리한다. 프로그래밍을 하는 관점에서는 이를 알 필요가 없다.
Spark 데이터 처리의 어려움 (Shuffling -> Partition Skewness)
Spark 데이터 처리의 문제는 Partition들 크기에 Skewness가 생기는 경우에 발생한다. Partition들의 크기가 비슷해야 병렬 처리의 의미가 있는데 하나의 Partition이 크기가 엄청나게 크다면 그 Partition 처리에 드는 시간이 전체 프로세싱 시간을 결정하게 되며 이 과정에서 메모리 에러 등 다양한 이슈들이 발생한다.
그러면 언제 Partition 크기에 Skewness가 생길까? DataFrame에 적용하는 오퍼레이션이 SQL로 치면 GROUP BY, ORDER BY, JOIN 등이라면 데이터 이동이 필요해지고 (이를 Shuffling이라 부른다) 이후 생기는 새로운 Partition 크기에 커다란 불균형(Skewness)이 생길 수 있으며 이는 빅데이터 처리에 MapReduce 시절부터 존재하는 문제이기도 하다.
이 경우 다양한 최적화 방법들이 존재하며 이를 배우는 것이 Spark 프로그래밍에서는 어려운 포인트라 할 수 있지만 사용법 자체는 Pandas와 비교해 크게 다르지 않다. 이번에 인프런에 Spark 강의를 하나 오픈했는데 내용은 Pandas로부터 시작해서 Spark의 다양한 기능을 DataFrame과 SQL 중심으로 Databricks Community Edition 위에서 배워보는 것이다. 강의 링크는 댓글 참고
다음 내용이 궁금하다면?
이미 회원이신가요?
2025년 4월 21일 오전 7:05