Apache Druid vs SQL-on-Hadoop
Apache Druid vs SQL-on-Hadoop
SQL-on-Hadoop 엔진은 다양한 데이터 포맷과 스토어에 실행 엔진을 제공하지만, Druid는 실시간 수집과 slice-n-dice 임시 쿼리를 위한 상시 서비스로 설계됐어요. 이 문서는 쿼리, 수집, 유연성 측면을 비교합니다.
출처: 문서
본문
SQL-on-Hadoop 엔진은 다양한 데이터 포맷과 데이터 스토어를 위한 실행 엔진을 제공하고, 많은 엔진이 계산을 Druid로 푸시다운하면서 Druid에 SQL 인터페이스를 제공할 수 있게 해줍니다.
두 기술을 직접 비교하고 언제 하나만 써야 하는지를 정하려면, 기본적으로 제품 요구사항과 각 시스템이 무엇을 위해 설계됐는지에 달려 있어요.
Druid는 다음을 위해 설계되었습니다.
- 항상 켜져 있는(always on) 서비스
- 실시간 데이터 수집
- slice-n-dice 스타일의 임시(ad-hoc) 쿼리 처리
SQL-on-Hadoop 엔진은 일반적으로 Map/Reduce를 우회하고, HDFS나 경우에 따라 다른 스토리지 시스템에서 직접 데이터를 쿼리합니다. Impala와 Presto를 포함한 일부 엔진은 HDFS 데이터 노드와 함께 배치되어 쿼리에 데이터 지역성(locality)을 달성하기 위해 조정할 수 있어요. 이것이 무슨 의미일까요? 세 가지 영역으로 나눠 이야기해볼 수 있어요.
- 쿼리(Queries)
- 데이터 수집(Data Ingestion)
- 쿼리 유연성(Query Flexibility)
쿼리
Druid 세그먼트는 데이터를 커스텀 컬럼 포맷으로 저장합니다. 세그먼트는 쿼리의 일부로 직접 스캔되고, 각 Druid 서버가 결과 집합을 계산한 뒤 최종적으로 Broker 레벨에서 병합합니다. 즉 서버 간에 전송되는 것은 쿼리와 결과이고, 모든 계산은 Druid 서버 내부에서 수행됩니다.
대부분의 SQL-on-Hadoop 엔진은 기본 스토리지 계층과 스토리지 포맷에 대한 쿼리 플래닝과 실행을 담당합니다. 이들은 쿼리가 실행되지 않아도 계속 떠 있는 프로세스라서(Hadoop MapReduce의 JVM 시작 비용을 없앰), 데이터가 저장된 곳에서 실행될 수 있는 데몬 프로세스를 가지는 일부 엔진(Impala/Presto)은 사실상 네트워크 전송 비용을 제거합니다. 하지만 기본 스토리지 계층에서 계산 계층으로 데이터를 끌어오는 데 여전히 약간의 지연 오버헤드(예: 직렬화/역직렬화 시간)가 있어요. 이것이 성능에 얼마나 영향을 주는지는 정확히 알지 못합니다.
데이터 수집
Druid는 데이터의 실시간 수집을 허용하도록 만들어졌습니다. 데이터를 수집하자마자 쿼리할 수 있고, 이벤트가 데이터에 반영되는 속도의 지연은 이벤트를 Druid로 전달하는 데 걸리는 시간에 의해 결정됩니다.
SQL-on-Hadoop은 HDFS나 다른 백킹 스토어의 데이터에 기반하기 때문에, 그 백킹 스토어가 데이터를 제공할 수 있는 속도에 수집 속도가 제한됩니다. 일반적으로 백킹 스토어가 데이터가 빨리 사용 가능해지는 데 가장 큰 병목이 됩니다.
쿼리 유연성
Druid의 쿼리 언어는 상당히 저수준이며 Druid가 내부적으로 동작하는 방식에 매핑됩니다. Druid를 고수준 쿼리 플래너와 결합해 대부분의 SQL 쿼리와 분석 SQL 쿼리(큰 테이블 간 조인 제외)를 지원할 수 있지만, 기본 Druid는 일반적인 처리를 위한 SQL-on-Hadoop 솔루션보다 유연성이 떨어져요.
SQL-on-Hadoop은 전체 조인(full join)을 갖춘 SQL 스타일 쿼리를 지원합니다.
Druid vs Parquet
Parquet은 SQL-on-Hadoop 엔진과 함께 작동하도록 설계된 컬럼 스토리지 포맷입니다. Parquet은 쿼리 실행 엔진이 없고, 대신 외부 소스가 데이터를 끌어내도록 의존합니다.
Druid의 저장 포맷은 선형 스캔에 고도로 최적화되어 있습니다. Druid가 중첩 데이터를 지원하긴 하지만, Parquet의 저장 포맷은 훨씬 더 계층적이고 이진 청킹(binary chunking)에 더 적합하게 설계됐어요. 이론적으로는 Druid에서 더 빠른 스캔이 가능해야 합니다.
더 알아보기 (Learn more)
- Druid와 SQL 엔진을 함께 쓰는 경우는 querying 문서를 확인해 보세요.
- Druid의 스토리지 포맷은 segments 문서를 참고하세요.