빅데이터 활용 도구와 서비스가 많아지고 있다. 그 중 대표적인 빅데이터 처리 시스템을 설명하고, 다루는 데이터의 양 / 처리 비용 / 비용 제약 등을 생각하며 어떤 도구를 사용해야 좋을지 알아보기로 한다.
1. PostgreSQL
- 오픈소스 RDB 이다.
- 가장 역사가 깊고 표준 SQL을 잘 준수하며 윈도우 함수, CTE(WITH 구문) 등 분석에 필수적으로 사용하는 구문 등을 모두 구현한다.
- GU Installer 를 제공한다.
2. Apache Hive
- 분산 처리 시스템을 사용하므로, 방대한 데이터를 고속으로 처리할 수 있다.
- 파일 기반의 시스템이다. 따라서, 특정 레코드 하나를 변경/제거하는 것이 어렵고 인덱스도 디폴트로 존재하지 않아 쿼리 실행 때 파일 전체를 조작해야 한다.
- 자세히 설명하면, 파둡 파일 시스템은 기본적으로 데이터를 CSV처럼 특정 기호로 구분해서 하나의 텍스트 파일에 블럭 단위(기본적으로 64MB 단위)로 저장합니다. 따라서 어떤 데이터를 수정하려면 블럭 크기에 해당하는 파일을 열고 저장해야 하는 비표율이 발생한다.
- 분산 처리 시스템의 원리 : 데이터를 작게 분할해서 여러 개의 디스크에 분산해서 저장하고 각 디스크에서 동시에 데이터를 읽어 들여 고속으로 처리함.
- 예를 들어, 전송 속도 180MB/s 하드디스크에서 5TB의 데이터를 읽어 들인다면 (5 x 1,024(1시간에을 초로 변환) x 1,024/180) = 58,254초 (=16시간 이상) 이 걸린다. 이를 100대의 디스크로 분산처리 한다면, 1/100으로 줄어든다.
- Hive는 HDFS(Hadoop File System)이라고 부르는 분산 파일 시스템 위의 데이터를 SQL 스러운 인터페이스로 간단하게 처리해 주는 시스템이다. 다만, 데이터를 동시에 읽기 때문에 순서를 맞춰주지 않는데, 이를 MapReduce 알고리즘으로 해결하였다.
- 즉, HDFS + MapReduce 아키텍처를 구현한 초기의 시스템이 Apache Hadoop이다.
- Hive은 Hadoop 생태계의 일부분으로, HiveQL이라 부르는 SQL스러운 쿼리 언어로 작성한 쿼리를 자동적으로 MapReduce 잡으로 변환해서 간단하게 병렬 분산 처리할 수 있다.
- 장점) Hive는 쿼리 실행 때 동적으로 데이터를 정의할 수 있다. 데이터를 HDFS 위에 그냥 축적해두고, 이후 필요한 시점에 종적으로 스키마를 정의할 수 있다.
- 추가로 데이터 분석을 위한 풍부한 UDF(User-Defined Function)를 활용해서 SQL만으로는 구현하기 어려운 문자열 처리 등을 간단하게 할 수 있다. 독자적인 UDF를 자바로 구현하므로 자바로 할 수 있는 처리 대부분은 Hive로도 할 수 있다. 다만, 리액턴시가 낮은 처리를 요구하는 경우에는 적합하지 않다.
3. Amazon Redshift
- AWS에서 제공하는 클라우드 서비스이고, 분산 병렬 RDB 이다. Hive 처럼 인터페이스를 제공해주지 않는다.
- 일반적인 RDB에서 다룰 수 없는 대량의 데이터와 상호 작용하는 쿼리를 실행하고 싶을 때 효과적이다.
- Hive에서 MapReduce를 사용한 분산 처리를 실행할 경우 가벼운 잡이라도 10초 이상이 걸리는데, Redshift는 몇 밀리 초 만에 결과를 리턴한다.
- 오픈소스가 아니기 때문에, 사용 시간에 따라 비용이 발생한다.
- (단점) 성능 튜닝을 하거나 비용을 줄이려면 최적의 노드 수와 스펙을 예측해서 인스턴스의 실행과 종료를 관리해야 한다. (전문적인 관리 인재가 필요)
- 컬럼 지향 스토리지 아키텍처이다. 테이블 설계 또는 쿼리 실행 때 일반적인 RDB와는 다른 발상이 필요하다.
- 컬럼 지향 스토리지란 ? 테이블의 데이터를 물리적으로 저장할 때, 레코드별로 저장하는 것이 아닌 컬럼별로 저장하는 아키텍처이다.
- 데이터의 압축률을 높일 수 있으며, 쿼리 실행 때 디스크 I/O를 줄일 수 있다. 따라서, Redshift의 테이블 설계는 일반적인 RDB의 정규화를 사용하기보다 분석에 필요한 데이터를 모두 하나의 테이블 컬럼에 추가하는 형태로 진행한다.
- 쿼리 실행 때도 "SELECT *" 처럼 모든 컬럼을 추출하는 쿼리는 성능이 낮게 나오므로 필요한 컬럼만 추출하는 쿼리를 실행해야 한다.
4. Google BigQuery
- 빅데이터 분석을 위해 구글이 제공하는 클라우드 서비스이다. Redshift와 다르게 직접 노드 인스턴스를 관리할 필요가 없으며, 사용 시간이 아니라 읽어들인 데이터의 양으로 비용이 발생한다는 점이 다르다. 따라서, 다루는 데이터가 적으면 적은 비용으로 운용할 수 있기에 접근 허들이 낮은 편이다.
- 구글의 데이터 분석 서비스인 Google Analytics4를 사용한다면 데이터를 BigQuery로 쉽게 넘겨서 처리할 수 있고, 구글이 제공하는 다른 클라우드 서비스와도 쉽게 연동할 수 있다.
- BigQuery의 인터페이스도 SQL스러운 쿼리 언어이지만, BigQuery 쿼리는 'Legacy SQL'과 'Standard SQL'로 2가지 종류가 있다.
- Legacy SQL는 FROM에 여러 테이블을 지정하면 UNION 되어버리거나, COUNT가 어림값으로 나오는 등의 SQL 표준과 다른 동작이 있어서 사용자가 불편함이 있다.
- 2016년부터 SQL 표준을 준수하는 Standard SQL이 등장해서 CTE, 상관 서브 쿼리 등을 지원하며 일반적인 SQL과 같은 방식으로 쿼리를 잘성할 수 있게 되었다.
- 단점) 읽어 들이는 데이터 양을 기반으로 비용이 발생하므로 사용 요금을 생각보다 예측하기 어렵다. 따라서, 데이터 로드를 줄일 수 있도록 자주 읽어 들이는 데이터만 모아서 별도의 테이블로 분할하거나 필요한 컬럼만 선택하는 SELECT 구문을 활용하는 등의 테크닉이 필요하다.
- 컬럼 지향 스토리지이므로, 쿼리 실행 때에 필요한 컬럼을 압축하면 읽어 들이는 데이터양을 크게 줄일 수 있다.
5. SparkSQL
- MapReduce를 사용한 분산 처리 프레임워크인 Apache Spark 의 기능 중에서 SQL 인터페이스와 관련된 기능을 나타내는 용어이다.
- 오픈 소스 프레임워크이다.
- 지금까지 소개한 오픈 소스 제품 중 가장 빠른 속도를 가지고 있으며, 기계학습 / 그래프 처리 / 실시간 스트리밍 등의 다양한 처리를 쉽게 분산 처리할 수 있는 기능 등도 제공한다.
- 장점) 빅데이터 활용과 관련된 대부분의 처리를 한 번에 구현할 수 있다.
- 데이터 활용 단계라고 함은, 데이터 추출(Python) -> 데이터 처리(SQL) -> 데이터 분석(R, Python) -> 엑셀로 리포팅
- Spark는 인터페이스로 SQL뿐만 아니라 파이썬, 스칼라, 자바, R 등의 프로그래밍 언어를 지원하며, 데이터 추출과 넣기 기능도 다양하게 가지고 있다. 따라서, 위의 과정을 모두 Spark 프로그램 내부에서 한 번에 구현할 수 있다.
댓글