아파치 스파크 (Apache Spark)
쉽게 풀면
아파치 스파크는 아주 큰 데이터를 여러 컴퓨터에 나누어 동시에 처리할 수 있게 해주는 도구이다. 이전 세대 기술인 맵리듀스가 중간 결과를 매번 디스크에 기록했던 것과 달리, 스파크는 가능한 한 데이터를 메모리에 올려둔 채로 반복 계산을 수행해서 훨씬 빠른 속도를 낸다. 대규모 로그 분석이나 딥러닝 학습에 쓰일 데이터를 정제·전처리하는 파이프라인에서 자주 활용된다.
왜 중요한가
데이터 규모가 한 대의 컴퓨터로 감당할 수 없을 만큼 커지면, 연구든 실무든 여러 대의 컴퓨터에 작업을 나누어 처리하는 분산 처리 기술이 필요해진다. 아파치 스파크는 이러한 분산 처리를 비교적 쉬운 API로 다룰 수 있게 해주기 때문에, 대규모 데이터 전처리·특징 추출·로그 분석을 다루는 논문에서 실험 파이프라인의 기반 인프라로 자주 언급된다. 특히 대규모 말뭉치나 센서 데이터를 다루는 자연어처리, 추천시스템, 사물인터넷 관련 연구에서 데이터 준비 단계의 표준 도구처럼 쓰인다.
어떤 절차인가
스파크는 큰 데이터를 여러 컴퓨터(노드)에 나누어 놓고, 같은 연산을 동시에 실행하는 분산 처리 엔진입니다. 2009년 UC 버클리 AMPLab에서 Matei Zaharia가 시작했고 2010년에 공개되었으며, 2013년 아파치 소프트웨어 재단에 기증되었습니다.
- 핵심 자료 구조: RDD(resilient distributed dataset)는 여러 노드에 나뉜 읽기 전용 데이터 집합입니다. 그 위에 DataFrame, Dataset API가 만들어졌습니다.
- 장애 복구: 각 RDD가 어떤 연산으로 만들어졌는지의 기록(계보, lineage)을 갖고 있어, 노드가 고장 나면 잃어버린 부분을 다시 계산해 복구합니다.
- 지연 실행: 변환 연산을 곧바로 실행하지 않고 처리 계획(방향성 비순환 그래프)을 세운 뒤 결과가 필요할 때 실행합니다.
- 구성 요소: Spark SQL, 구조적 스트리밍, MLlib(기계학습), GraphX(그래프 처리) 등이 같은 엔진 위에서 동작합니다. 종합 설명은 Zaharia 등(2016), SQL은 Armbrust 등(2015), MLlib은 Meng 등(2015)에 있습니다.
- 사용 언어와 실행 환경: Scala, Java, Python, R, SQL을 쓸 수 있고, 독립 실행형·YARN·메소스·쿠버네티스 같은 클러스터 관리자 위에서 돌아갑니다.
언제 쓰고 무엇을 얻나
중간 결과를 매번 디스크에 쓰는 맵리듀스(Dean & Ghemawat, 2008)와 달리 스파크는 데이터를 메모리에 올려 둔 채 재사용할 수 있어, 같은 데이터를 반복해서 계산하는 작업(반복 기계학습, 대화식 분석)에서 지연 시간을 크게 줄일 수 있다고 설명됩니다.
- 한 대의 컴퓨터 메모리에 들어가지 않는 규모의 로그·말뭉치·센서 자료의 정제와 변환
- 같은 자료를 여러 번 읽는 반복 연산(특징 추출, 모형 학습)
- 배치 처리와 스트림 처리를 한 틀에서 다루려는 경우
반대로 자료가 한 대의 컴퓨터로 충분히 처리되는 규모라면 클러스터를 구성하는 수고가 이득보다 클 수 있습니다.
논문에는 이렇게 적는다
분산 처리 결과는 설정에 따라 시간이 크게 달라지므로, 재현을 위해 다음을 적습니다.
- 스파크 버전과 사용한 API(RDD, DataFrame, SQL, MLlib 등)
- 클러스터 관리자와 노드 수, 노드당 코어 수·메모리
- 입력 자료의 크기와 파티션 수, 저장 형식
- 실행 시간은 여러 번 반복한 평균 또는 중앙값과 변동 정도
수집 로그 120 GB를 노드 8대(노드당 코어 16개, 메모리 64 GB)의 Spark 3.x 클러스터에서 DataFrame API로 정제하였다. (형식을 보여 주려는 가상의 문장이며 수치는 임의입니다.)
논문에서는 이렇게 쓰입니다
실제 논문에서
이 용어를 직접 쓴 국내 논문 문장을 아직 수집하지 못했습니다. 수집되는 대로 출처와 함께 싣겠습니다.
예시 문장
아래는 용어의 쓰임을 보여 주려고 만든 예시로, 실제 논문에서 가져온 문장이 아닙니다.
대량으로 수집한 웹 데이터를 여러 대의 컴퓨터에서 병렬로 처리하는 스파크를 이용해 정리했다는 뜻이다.
사물인터넷 등에서 끊임없이 들어오는 센서 데이터를 스파크의 스트리밍 기능으로 실시간에 가깝게 처리했다는 의미이다.
대량의 거래 데이터를 여러 노드에 나누어 특징을 뽑아내는 작업을 스파크의 내장 머신러닝 라이브러리로 처리했다는 뜻이다.
조금 더 깊게 보면
스파크의 핵심 개념 중 하나는 RDD(Resilient Distributed Dataset)와 이를 발전시킨 DataFrame 구조로, 데이터를 여러 노드에 나누어 저장하면서도 노드 장애 시 재계산을 통해 복구할 수 있게 설계되어 있다. 또한 스파크는 연산을 즉시 실행하지 않고 지연 실행(lazy evaluation) 방식으로 처리 계획을 최적화한 뒤 한꺼번에 실행하는 특징이 있는데, 이 덕분에 불필요한 중간 연산을 줄일 수 있다. 논문에서 성능을 논할 때는 처리 시간 외에도 셔플(shuffle) 비용, 파티션 수, 클러스터 노드 수 같은 설정값이 함께 언급되는 경우가 많으므로, 실험 재현성을 확인하려면 이러한 설정 정보를 같이 살펴보는 것이 도움이 된다.
주의할 점
스파크는 대규모 배치 데이터 처리에 강점이 있지만, 아주 작은 데이터셋이나 단순 작업에는 오히려 설정과 실행 오버헤드가 더 클 수 있다.
헷갈리기 쉬운 용어
스파크와 맵리듀스는 모두 분산 처리 방식이지만, 중간 결과를 다루는 방식이 다릅니다.
| 용어 | 중간 결과 처리 | 잘 맞는 작업 |
|---|---|---|
| 아파치 스파크 | 메모리 안의 작업 집합으로 재사용할 수 있음 | 반복 계산, 대화식 분석 |
| 맵리듀스 | 단계 사이 중간 결과를 디스크에 기록 | 한 번 훑는 대규모 배치 처리 |
참고 문헌
- Zaharia, M., Xin, R. S., Wendell, P., Das, T., Armbrust, M., Dave, A., Meng, X., Rosen, J., Venkataraman, S., Franklin, M. J., Ghodsi, A., Gonzalez, J., Shenker, S., & Stoica, I. (2016). Apache Spark: A unified engine for big data processing. Communications of the ACM, 59(11), 56–65.
- Armbrust, M., Xin, R. S., Lian, C., Huai, Y., Liu, D., Bradley, J. K., Meng, X., Kaftan, T., Franklin, M. J., Ghodsi, A., & Zaharia, M. (2015). Spark SQL: Relational data processing in Spark. Proceedings of the 2015 ACM SIGMOD International Conference on Management of Data, 1383–1394.
- Meng, X., Bradley, J., Yavuz, B., Sparks, E., Venkataraman, S., Liu, D., Freeman, J., Tsai, D. B., Amde, M., Owen, S., Xin, D., Xin, R., Franklin, M. J., Zadeh, R., Zaharia, M., & Talwalkar, A. (2015). MLlib: Machine learning in Apache Spark. arXiv preprint arXiv:1505.06807.
- Dean, J., & Ghemawat, S. (2008). MapReduce: Simplified data processing on large clusters. Communications of the ACM, 51(1), 107–113.
표의 기준값은 위 문헌에 근거한 관례이며, 분야·학술지마다 다른 기준을 쓸 수 있습니다.