하둡은 분산 환경의 병렬 처리 프레임워크로서 크게 보면 분산 파일시스템인 HDFS(Hadoop distributed file system)와 데이터 처리를 위한 맵리듀스 프레임워크로 구성돼 있습니다.
또한 2.0버전 이후부터는 CPU와 메모리 등 컴퓨팅 자원 관리를 전담하는 리소스 관리 시스템인 Yarn을 포함해 기존 맵리듀스 프로그래밍 모델을 Yarn 기반으로 구축할 수 있도록 지원하고 있습니다.
하둡은 여러 대의 서버를 이용해 하나의 클러스터를 구성하며, 이렇게 클러스터로 묶인 서버의 자원을 하나의 서버처럼 사용할 수 있는 클러스터 컴퓨팅 환경을 제공합니다.
기본적인 동작 방법은 분석할 데이터를 하둡 파일시스템인 HDFS에 저장해 두고 HDFS상에서 맵리듀스 프로그램을 이용해 데이터 처리를 수행하는 방식입니다.
데이터를 저장할 때는 전체 데이터를 블록이라고 하는 일정한 크기로 나눠서 여러 데이터 노드에 분산해서 저장하는데, 이때 각 블록들을 어느 데이터 노드에 저장돼 있는지에 대한 메타정보를 네임노드에 기록합니다. 그리고 맵리듀스 잡을 실행 할 때는 거꾸로 네임노드로 부터 메타정보를 읽어서 처리할 데이터의 위치를 확인하고 분산처리를 수행합니다.
맵리듀스 프레임워크는 하둡의 대표적인 데이터 처리 프레임워크로서 데이터를 여러 개의 맵 프로세스와 리듀서 프로세스로 나눠서 처리하는 방식입니다. 맵 프로세스는 여러 데이터노드에 분산 저장된 데이터를 각 서버에서 병렬로 나누어 처리하며, 리듀서는 그러한 맵 프로세스들의 결과를 조합해 최종 결과를 만들어 냅니다.
이때 데이터를 나누는 과정에서는 실제로 파일의 복사본이 각 서버로 나누어 전달되는 것은 아니고 네트워크를 통한 데이터 이동을 최소화 하기 위해 데이터가 있는 서버에서 프로세스를 구동시킵니다. 덕분에 데이터에 대한 지역성을 높이는 장점이 있습니다.
이러한 맵리듀스 잡의 제어는 네임노드에서 구동되는 잡 스케줄러와 태스크 스케줄러라는 프로세스가 처리했습니다.
하지만 기본적으로 하나의 클러스터에서 한 개의 맵리듀스 잡만 구동할 수 있었기 때문에 CPU와 메모리 자원을 효율적으로 사용하지 못하는 문제가 있었습니다.
이 때문에 최근 배포된 하둡 2.0 부터는 데이터 처리 작업에 대한 스케줄링과 서버 자원관리를 Yarn이라는 자원관리 시스템에서 전답하면서 이러한 문제점이 개선됐습니다.
이처럼 하둡은 꾸준한 업데이트를 통해 빅데이터 처리의 핵심 프레임워크로 자리 잡았지만 앞에서 언급한 것 처럼 하둡만으로 모든 데이터 처리를 수행하기에는 부족한 부분이 있었습니다.
먼저 하둡의 맵리듀스 잡은 대부분의 연산 작업을 파일시스템 기반으로 처리했기 때문에 스파크 같은 메모리 기반 데이터 처리 방식에 비해 상대적으로 높은 성능을 기대하기 어려운 면이 있었습니다.
두 번째는 맵리듀스를 이용해 데이터를 처리하려면 대부분 자바 언어을 사용해 맵리듀스 프로그램을 작성해야만 했습니다. 물론 맵과 리듀스 패턴이 막강해서 여러 복잡한 문제들을 이 방식으로 해결할 수 있었다 하더라도 현업에서 만나는 다양한 데이터 분석 요구사항을 맵과 리듀서라는 하나의 패턴으로만 치환해서 처리하기는 쉬운 일이 아니었습니다.
또한 외부 라이브러리의 도움 없이 단위 테스트를 작성하거나 실제 데이터를 대상으로 간단한 시뮬레이션을 해보기가 상대적으로 쉽지 않고, 무엇보다 자바 언어를 기반으로 프로그램을 작성하므로 파이썬이나 R등 다른 분석용 도구를 연동해서 사용하려면 파일시스템과 같은 외부 스토리지를 중간에 두고 결과 파일을 주고받아야만 하는 불편함이 있습니다.
이에 반해 SQL on Hadoop으로 대표되는 하이브의 경우 개발자들에게 친숙한 SQL을 사용해 맵리듀스 잡을 생성할 수 있다는 장점이 있었습니다. 하지만 이를 위해서는 미리 사용할 테이블과 데이터를 설계해 준비해둬야 하고 복잡한 알고리즘을 구현할 때는 원하는 성능을 얻지 못하거나 구현 자체가 맵리듀스 코드를 작성할 때보다 더 복잡해지는 경우가 있었습니다.
스파크는 하둡 기반의 맵리듀스 작업이 가진 이 같은 단점들을 보완하기 위한 것으로 2009년 UC Berkeley 대학의 연구로 시작되어 2012년에 미국 NSDI 학회에서 스파크의 핵심 개념인 RDD(Resilient distributed dataset)에 대한 논문이 발표되면서 세상에 알려졌습니다.
스파크는 하둡과 달리 메모리를 이용한 데이터 저장 방식을 제공함으로써 머신러닝 등 반복적인 데이터 처리가 필요한 분야에서 높은 성능을 보여줬습니다. 또한 작업을 실행하기 전에 최적의 처리 흐름을 찾는 과정을 포함하고 있었기 때문에 성능 향상과 더불어 여러 개의 맵리듀스 잡을 직접순차적으로 실행해야 하는 수고를 덜 수 있게 됐습니다.
특히, 맵리듀스에 비해 훨씬 자연스럽고도 강력한 다수의 데이터 처리 함수를 제공함으로써 프로그램의 복잡도를 크게 낮춰준다는 점은 매우 큰 장점이라고 할 수 있습니다. 게다가 스파크 2.0부터는 자바, 스칼라, 파이썬뿐만 아니라 R 스크립트를 이용해서도 스파크 애플리케이션을 작성할 수 있게 되어 언어에 의한 장벽도 상당 부분 해소됐습니다.
이 밖에도 실시간 스트리밍 데이터를 다루기 위한 "스파크 스트리밍"과 하이브와의 연동도 가능한 스키마 기반 데이터 분석 모듈인 "스파크 SQL", 그래프 알고리즘 처리르 위한 "GraphX", 통계 분석 프로그램인 R과 연동을 하는 "Spark R", 머신러닝 알고리즘 수행을 위한 "MLlib"등 각종 데이터 처리 분야에 특화된 라이브러리도 제공합니다.
스파크는 하둡을 비롯한 기존 빅데이터 처리 도구의 부족한 부분들을 보완해 주는 것이지 대체하기 위한 것은 아니라는 점을 염두에 두고 지금부터 좀 더 자세히 살펴보겠습니다.
'Big Data > Spark' 카테고리의 다른 글
[Spark]Spark SQL (0) | 2020.06.09 |
---|---|
[Spark] Java WordCount 예제를 통한 Spark 처리 흐름 파악 (1) | 2020.06.04 |
[Spark]RDD(Resilient Distributed Dataset) (0) | 2020.06.01 |
댓글