Spark
일전에 pyspark에 대한 설치와 간략한 Spark의 기능들에 대해 설명했었습니다만, 다시 한번 세세하게 적어보고자 합니다.
Spark를 이해하기 위해서는 데이터 처리 방식에 대해서 이해 할 필요가 있습니다.
키워드는 두 가지로 생각 할 수 있겠네요.
병렬 처리란
병렬 처리는 여러 일을 동시에 수행한다는 의미입니다. 병렬처리의 최적화를 한다는 의미는 한 노드 혹은 CPU가 최적으로 연산 할 수 있는 환경을 만드는 것이 아닐까 생각합니다.
요약 : 여러 일을 동시에 수행한다.
분산 처리란
분산 처리는 한 가지의 일을 여러 노드에서 하나의 태스크를 실행 한 뒤 결과를 모으는 방식을 말합니다. 여기서 여러 노드가 태스크를 실행한다는 뜻은 동일한 작업을 실행한다는 뜻입니다.
이러한 기능이 가능하기 위해서는 태스크를 각 노드로 분배(Distribute) 할 수 있도록 네트워크가 있어야 한다는 의미이므로, 분산 처리를 최적화 한다면 이 네트워크 관련 이슈를 해결 해야 합니다.
요약 : 여러 노드로 하나의 일을 수행한다.
Spark는 병렬 분산 처리 플랫폼
이제 Spark가 하는 일에 대해서 설명하기 쉬울 것 같습니다. 먼저 Spark는 병렬 분산 처리 플랫폼입니다. 즉 위에서 설명 한 병렬 처리와 분산 처리를 동시에 수행합니다.
병렬처리는 한 서버에서 일어나는 일이고, 태스크를 나누어 작업을 한다는 개념으로 생각하면 가능 할 것 같은데 분산 환경에서 이러한 작업을 한다고 생각하니 어렵게 느껴집니다. 하지만 Spark는 간단하게 구현 할 수 있습니다.
바로 Resilient Distributed Dataset(RDD) 덕분입니다.
Spark는 분산된 환경에서 데이터 병렬 모델을 추상화하여 사용 할 수 있는 RDD를 지원해주기 때문입니다.
주의해야 하는 점
Spark를 통해서 데이터를 처리 할 때 우리가 주의 할 점이 있습니다. 마치 만능처럼 보이는 Spark는 사실 파이썬 인메모리 데이터 분석 라이브러리인 Pandas보다 느리다는 말을 자주 들어왔습니다.
여기서 중요 한 점은 기대보다 느릴 수 있다 입니다.
마치 분산 된 환경에서 병렬처리를 한다는 말로 무조건적으로 효과적이라는 오해가 있을 수 있지만, Spark가 분산 환경에서 동작한다는 이야기는 곧 노드간 네트워크 통신 이 필요하다는 이야기로 일반적으로 알려진 메모리 > 디스크 > 네트워크 속도 차이들을 인지 할 필요가 있습니다.
노드 간 통신은 곧 네트워크 통신 입니다. 즉 코드를 작성 할 때 각 환경에서 최적의 필터링을 거친 후 노드 간 통신을 최적화 할 필요가 있습니다.
참고
https://dongwooklee96.github.io/post/2021/03/26/cap-%EC%9D%B4%EB%A1%A0%EC%9D%B4%EB%9E%80/