Hive에 의한 구조화 데이터의 생성과 Presto에 의한 대화식 쿼리
쿼리 엔진을 사용하여 데이터 마트를 만들기까지의 흐름(Hive와 Presto 결합)
Hive
이용Presto
를 사용함으로써 실행 시간 단축Hive
에서 만든 각 테이블의 정보는 ‘Hive 메타 스토어(Hive Metastore)’ 라고 불리는 특별한 데이터베이스에 저장됨외부 테이블(external table) 정의
# Hive 가동
$ hive
# 외부 테이블 access_log_csv를 정의
CREATE EXTERNAL TABLE access_log_csv(
time string, request string, status int, bytes int
)
# csv 형식임을 지정
ROW FORMAT SERDE 'org,
# 경로를 지정(디렉터리 내의 모든 파일이 읽어짐)
STORED AT TEXTFILE LOCATION '/.../'
# csv의 헤더행 스킵
TBLPROPERTIEX('skip.header.line.count'='1');
데이터 집계의 고속화(배치형 쿼리 엔진)
Cf) 이러한 최적화는 Hive 뿐만 아니라 빅데이터를 집계할 때 항상 의식해두는 것이 중요하다
초기 단계에서 팩트 테이블 작게 하기
Hive 쿼리는 SQL과 매우 유사하지만, 그 특성은 일반적인 RDB와는 전혀 다름
Hive는 데이터베이스가 아닌 데이터 처리를 위한 배치 처리 구조임. 따라서, 읽어들이는 데이터의 양을 의식하면서 쿼리를 작성하지 않으면 성능이 나오지 않음
비효율적인 쿼리의 예
팩트 테이블(access_log)과 디멘션 테이블(user)을 결합하고 WHERE로 조건을 부여
팩트 테이블을 필터링할 조건이 없기 때문에, 모든 데이트럴 읽어 들인 후에 결합하고 이후에 나오는 WHERE에 의해 검색을 하게 됨
대량의 중간 데이터가 생성되고, 그 대부분을 그냥 버려 낭비가 큰 처리가 됨
SELECT ...
FROM access_log a
JOIN users b ON b.id = a.user_id
WHERE b.created_at = '2017-01-01'
SELECT ...
FROM (
SELECT * access_log
WHERE time >= TIMESTAMP '2017-01-01 00:00:00'
) a
JOIN users b ON b.id = a.user_id
WHERE b.created_at = '2017-01-01'
분산 시스템의 성능 발휘를 위해
데이터 편차(data skew): 고속화를 방해하는 문제.
Ex) 분산 시스템에서 SELECT count(distinct...)을 실행하는 것은 다른 것을 실행하는 것보다 오래 걸림. 중복이 없는 값을 세려면, 데이터를 한 곳에 모아야 해서 분산 처리하기 어려워지기 때문
하지만, GROUP BY에 의한 그룹화는 분산 처리됨. 만약 30일동안의 데이터가 있다면, 쿼리는 최대 30으로 분할됨. 하지만 날짜별로 데이터에 편차가 있다면, 문제
분산 시스템의 성능을 발휘하기 위해서는 이러한 데이터의 편차를 최대한 없애고, 모든 노드에 데이터가 균등하게 분산되도록 해야 함.
Presto로 구조화 데이터 집계하기
Hive같은 배치형 쿼리 엔진은 작은 쿼리를 여러 번 실행하는 대화형 데이터 처리에는 적합하지 않음. 쿼리 실행의 지연을 감소시키는 것을 목적으로 개발된 것이 ‘대화형 쿼리 엔진’ 임
이 분야에서 자주 참고되는 기술은 2010년 구글에서 발표된 ‘Dremel’임. 수천 대의 컴퓨터에 분산된 열 지향 스토리지를 사용하여 집계 가속화
Presto: 2013년 말 페이스북에서 출시됨
하나의 쿼리 안에서 여러 데이터 소스에 연결 가능
읽기와 코드 실행 병렬 처리
쿼리 실행에는 가급적 대화형 쿼리 엔진 사용
- Presto는 쿼리의 실행 과정에서 디스크에 쓰기를 하지 않음. 모든 데이터 처리를 메모리상에서 실시하고, 메모리가 부족하면 기다리거나 실패함.
- 취급하는 데이터의 양이 아무리 많아도, 비례하여 메모리 소비가 늘어나지 않음.
- 따라서, 메모리상에서 할 수 있는 것은 메모리상에서 실행하고, 아무래도 디스크가 있어야 하는 일부 데이터 처리만을 Hive등에 맡기는 것이 효과적.
- 몇 시간이나 걸리는 대규모 배치 처리와 거대한 테이블끼리의 결합 등에는 디스크를 활용해야 함. 단기간 쿼리 실행에는 대화형 쿼리 사용
완성된 비정규화 테이블의 고속 집계에 적합
데이터양에 좌우되지 않는 쿼리 엔진
Hadoop 상의 분산 애플리케이션은 애초에 높은 확장성과 내결함성을 목표로 설계됨
텍스트 데이터 가공, 열 지향 스토리지를 만드는 등의 무거운 처리에 적합
대화성이라기 보다는 안전성에 장점이 있음
속도 중시 & 대화식으로 특화된 쿼리 엔진
장점
단점
분산 시스템을 사용한 프로그래밍 환경
장점
인 메모리의 데이터 처리가 중심
대화형 쿼리 실행에 적합
ETL 프로세스에서 SQL에 이르기까지 일련의 흐름을 하나의 데이터 파이프라인으로 기술할 수 있음
분산 시스템을 사용한 프로그래밍 환경이므로, ETL 프로세스이거나 머신러닝같은 데이터 처리에 활용할 수 있음.
메모리를 어떻게 관리하느냐가 중요함.