병렬쿼리시스템, 구글 Sawzall, 아파치 Pig, 아파치 Hive
오늘 포스팅에서는 병렬 쿼리 시스템이란 무엇인지와 대표적인 예시인 구글의 Sawzall, 아파치 Pig, 아파치 하이브에 대해 공부해보겠습니다.
병렬쿼리시스템이란?
병렬 쿼리 시스템은 대용량 데이터베이스 및 데이터 웨어하우스에서 데이터 처리를 가속화하는 핵심 기술 중 하나입니다.
구글이나 하둡의 MapReduce는 개발자들에게 구현하려는 알고리즘에만 포커싱할 수 있도록 간단한 프로그래밍 모델을
제공하였습니다. 그러나 간단한 프로그래밍 모델이지만 일부 사용자들에게는 새로운 개념이기 때문에 여전히 쉽지 않았고 직접 코딩하지 않고 쉽고 빠르게 서비스나 알고리즘을 구현하고 적용해 볼 수 있는 환경에 대한 필요성이 대두되었습니다. 이러한 사용자들의 요구사항을 반영해서 스크립트나 사용자에게 친숙한 쿼리 인터페이스를 통해 병렬 처리할 수 있는
시스템들이 개발됐습니다. 그 중 대표적으로 구글의 Sawzall, 야후의 Pig, 아파치 하이브에 대해 자세히 알아보겠습니다.
1. 구글 Sawzall
Sawzall은 MapReduce를 추상화한 스크립트 형태의 병렬 프로그래밍 언어입니다.
Sawzall은 인터프리트 방식에 의해 언어를 해석하여, 자동으로 일련의 MapReduce업무를 생성, 수행합니다.
Sawzall의 데이터 구조 선언문은 Pascal 구문과 유사하고 제어문, 표현식 등은 C를 기반으로 만들어진 스크립트
언어입니다.
Sawzall 언어는 MapReduce 모델처럼 외부 입출력 데이터의 형식을 정의하는 기능(프로토콜 버퍼 형식이라고 함)과
이를 기반으로 개개의 입력 데이터에 대해 처리하는 기능을 정의하는 기능, 그리고 처리 결과를 중간 결과로 방출하는
기능, 결과를 집계 처리하는 기능으로 구성됩니다.
(전자통신동향분석 제24권 24호 2009년 8월, 클라우드 기반 대규모 데이터 처리 및 관리 기술 차고)
Sawzall은 MapRudece를 추상화한 최초의 병렬 쿼리 언어이며, 이후 나온 오픈소스 프로젝트인 Pig나 하이브(Hive)도
개발 배경과 기본적인 개념은 Sawzall과 유사합니다.
2. 아파치 Pig
Pig는 야후에서 개발해 오픈소스 프로젝트화한 데이터 처리를 위한 고차원 언어입니다.
Pig의 개발 배경으로 MapReduce는 Map과 Reduce 두 단계로 이루어진 단순 병렬 모델이지만,
실제 작업은 한 번으로 끝나지 않고, Map의 결과가 또 다른 Map의 입력으로 Reduce의 결과가 다른 Map의 입력으로
들어가야 하는 Chaining이 되어야 하기 때문에 MapReduce 자체적으로 지원하기 어려웠습니다.
또한 MapReduce 작업 자체가 단순한 모델이기 때문에 개발자들이 유사한 알고리즘들을 중복 개발하고 코드의 특성상
의미 파악이 어려워 공유가 되지 않았습니다. 이러한 요구 사항을 해결하기 위해 Pig를 개발하게 되었습니다.
Pig는 Hadoop MapReduce위에서 동작하는 추상화된 병렬 처리 언어이며, 현재 아파치 하둡의 서브 프로젝트입니다.
Pig에서 다루는 데이터는 Data Atom, Tuple, Data Bag 혹은 Map으로 구성되며,
Pig의 데이터 플로 언어인 Pig Latin은 다음과 같은 5개의 기본 골격으로 구성됩니다.
1) LOAD: 파일로부터 데이터를 구조화하여 로드하는 방법을 정의하는 것으로 사용자가 정의한 함수 이용도 가능합니다.
2) FILTER: 로드된 데이터 중 필요 없는 데이터를 프레디키트 및 Boolean조건을 주어 제거 가능합니다.
3) COGROUP: 데이터를 그룹핑하는 것으로 특정 필드 값들을 기준으로 그룹핑, 조인에 의한 그룹 핑이 가능합니다.
4) FOREACH/GENERATE: 데이터를 변환하여 새로운 데이터를 생성한다. 변환 기능으로 필드 값 추출, 함수 호출,
중첩된 Bag 데이터를 평준화하는 flattening, 정렬 기능 등을 제공합니다.
5) STORE: 결과를 외부 데이터 소스에 저장하는 것으로 저장 방법 명시가 가능합니다.
3. 아파치 Hive
하이브는 수십 테라 바이트 이상의 데이터를 다루어야 하는 환경에서 데이터 분석 및 쿼리 처리를 위해 페이스북에서
개발한 데이터 웨어하우징 인프라입니다. Pig와 마찬가지로 하둡 플랫폼 위에서 동작하며,
사용자가 쉽게 사용할 수 있도록 SQL 기반의 쿼리 언어와 JDBC를 지원합니다.
또한 하둡에서 가장 많이 사용되는 병렬처리 기능인 Hadoop-Streaming을 쿼리 내부에 삽입해 사용할 수 있습니다.
아파치 Hive 아키텍처
아파치 Hive는 다음과 같은 핵심 아키텍처로 구성되어 있습니다.
1) Metastore: Metastore는 Hive의 메타데이터를 저장하는 중요한 구성 요소입니다. 테이블 스키마, 파티션 정보, 데이터 위치 등의 메타데이터가 저장되며, 이를 통해 Hive는 데이터를 쿼리하고 처리할 수 있습니다.
별도의 DBMS를 설정하지 않으면, Embedded Derby를 기본 데이터베이스로 합니다.
2) Hive QL: Hive Query Language(Hive QL)은 SQL과 유사한 Hive의 질의 언어입니다. 사용자는 Hive QL을 사용하여 SQL과 비슷한 방식으로 데이터를 조회하고 조작할 수 있습니다.
3) Execution Engine: Hive의 실행 엔진은 사용자가 작성한 Hive QL 쿼리를 실행하는 역할을 합니다. MapReduce, Tez, 또는 Spark와 같은 다양한 백엔드 엔진을 지원하여 사용자는 데이터 처리 방식을 선택할 수 있습니다.
4) Driver: Hive Driver는 사용자로부터 입력된 Hive QL 쿼리를 받아 파싱하고 실행 엔진에 전달하는 역할을 합니다.
5) User Interface: Hive는 명령 줄 인터페이스(CLI) 및 웹 기반 사용자 인터페이스를 제공하여 사용자가 데이터베이스와 상호작용할 수 있는 환경을 제공합니다.
아파치 Hive의 병렬쿼리 흐름을 보면 앞 단에는 커맨드 라인 인터페이스(CLI)가 있고 사용자는 이 CLI를 통해
Join이나 Group by 같은 SQL 쿼리를 합니다. 그러면 파서(Parser)에서 쿼리를 받아 구문 분석을 하고, MetaStore에서 테이블과 파티션 정보를 참조해 Execution Plan을 만들어냅니다. 만들어진 이 Plan을 Execution Engine에 보내고
Execution Engine은 하둡의 JobTracker와 네임노드와 통신을 담당하는 창구 역할을 하면서 MapReudece 작업을
실행하고 파일을 관리합니다.