하둡 환경에서의 Hive를 통해 쿼리를 작성하는 기본 원리와 Hive 관련 개념을 공부해보자.
1. 쿼리 엔진
1-1. SQL on Hadoop
Hive 메타 스토어(Metastore) : Hive에서 만들어진 테이블 정보를 저장해주는 데이터베이스
(1) Hive 외부 테이블 정의
CREATE EXTERNAL TABLE access_log_csv(
time string,
request string,
status int,
bytes int
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS TEXTFILE LOCATION '/var/log/access_log/'
TBLPROPERTIES('skip.header.line.count'='1');
- EXTERNAL TABLE (외부 테이블) : Hive 외부 파일을 참고하여 테이블이 존재하는 것처럼 데이터를 읽는 방식
- ORG.APACHE ... OPENCSVSERDE : CSV 형식으로 지정
- STORED AS ... LOCATION : 해당 디렉터리 내의 경로 지정
- TBLPROPERTIES ... - 테이블 속성 정의(CSV 헤더행 제외)
(2) Hive 쿼리 속도 개선 하는법 : 서브 쿼리를 통해 레코드 수 줄이기
SELECT *
FROM(SELECT *
FROM access_log
WHERE time >= TIMESTAMP '2022-01-01 00:00:00'
) a
JOIN users b ON b.id = a.user_id
WHERE b.created_at = '2022-01-01'
- 서브 쿼리 : 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문
- 위 코드에서는 FROM 절에서 서브 쿼리가 존재하며, 하나의 테이블처럼 사용한다.
- 서브 쿼리를 이용하면 초기 팩트 테이블을 작게 만들어서 효율적인 집계를 가능하게 한다.
1-2. 대화형 쿼리 엔진 - Presto
위에서 배운 Hive는 대규모 데이터를 배치 처리하는 것에 적합한 기술이다. 그러나 단순한 쿼리를 여러 번 반복하는 대화형 처리에서는 Hive가 효율적이지 않다. 이때, 단순 쿼리를 반복 실행하기 위해 등장하게 된 것이 '대화형 쿼리 엔진(Presto)’이다.
(1) Presto의 구조 및 원리
- Presto CLI : 쿼리 명령어 전달
- Presto Coordinator(코디네이터) : 전달 받은 쿼리 문법을 분석하고 실행 계획 수립
- Presto Worker(워커) : 역할을 분배하여 실질적으로 데이터를 처리
- Presto는 쿼리 실행을 중단시킬 수 없으므로 방대한 쿼리를 실행하면 안된다.
(2) Hadoop과 Presto의 차이
2. 데이터 마트의 구축
데이터를 분석하고 시각화하기 위해서는 데이터 웨어하우스(또는 데이터 레이크)에서 필요한 데이터만을 선택하여 데이터 마트를 만드는 절차가 필요하다. 위에서 데이터 마트에 대한 개념으로 팩트 테이블과 디멘전 테이블을 알아봤는데, 다시 상기시켜보자.
- 팩트 테이블 : 트랜잭션(시간에 따라 생성되는 데이터)과 같이 사실이 기록된 테이블
- 디멘전 테이블 : 팩트 테이블에 참고되는 테이블
2-1. 팩트 테이블(=트랜잭션 데이터)을 작성하는 2가지 방법
(1) 추가(append)를 통한 테이블 작성 - 팩트 테이블에 데이터를 계속 추가하는 방식
- 추가(append)를 통한 테이블 작성의 단점
- 새로운 데이터가 누락되면 팩트 테이블에 결손이 발생한다.
- 새로운 데이터 추가가 여러 번 실행되면 데이터 중복이 발생할 수 있다.
- 이러한 단점을 해결할 수 있는 방법 → 테이블 파티셔닝
- 테이블을 파티션 단위로 정리하여 데이터 읽기 및 쓰기가 가능하다.
- 일정한 주기를 가지고 새 파티션이 생성되고 팩트 테이블에 추가(append)되는 방식으로 사용한다.
- 이때, 파티션은 매번 교체되도록 하여 데이터 중복의 가능성을 배제하게 된다.
(2) 치환(replace)을 통한 테이블 작성 - 새로운 데이터를 포함하여 팩트 테이블 전체를 다시 만드는 방식
- 치환(replace)을 통한 테이블 작성의 장점
- 테이블 전체를 치환하므로 데이터 중복 및 누락이 거의 없다.
- 스키마 변경에 대해 유연하게 대응할 수 있다.
- 단순 쿼리를 통해 테이블 치환이 가능하다.
- 치환(replace)을 통한 테이블 작성의 단점
- 데이터의 양이 많은 경우 처리 시간이 오래 걸린다.
- 그렇기 때문에 일반적으로 1시간 이내에 팩트 테이블을 만들 수 있는 경우에만 치환을 사용한다.
2-2. 디멘전 테이블(=마스터 데이터)을 작성하는 2가지 방법
(1) 스냅샷 테이블(snapshot table)
- 정기적으로 테이블 전체를 저장하는 방법 (쉽게 말하자면 특정 시점의 테이블 상태를 기록하는 방식)
- 스냅샷 테이블의 단점
- 한 시점의 기록이기 때문에 나중에 다시 만들 수 없다.
- 그러므로 데이터 웨어하우스에 보관하여 테이블이 삭제되지 않도록 조심해야 한다.
(2) 이력 테이블(history table)
- 변경 내용 이력만을 저장하는 방법
- 데이터에 변경이 있을 때만 내용을 기록하는 방식
- 이력 테이블의 단점
- 변경 이력을 저장하기 때문에 시간이 지나면서 테이블 전체를 복원하는 것이 어렵다.
이번 장에서는 빅데이터의 분산 처리에 대한 개념과 Hive / Presto의 장단점을 배울 수 있었다. 또한, 데이터의 규모에 따라 사용해야 하는 테이블 형식과 파티션 사용의 목적에 대해 배울 수 있었다. DA 직무에 필요한 개념을 가장 많이 배울 수 있었고, 앞으로 업무를 하면서 관련 지식을 더 많이 배워나가야함을 느낄 수 있었다.
📘참고 서적: [빅데이터를 지탱하는 기술]
니시다 케이스케 지음 / 정인식 옮김
'[기술서적]' 카테고리의 다른 글
[빅데이터를 지탱하는 기술] Chapter4.빅데이터의 축적 - (2) (0) | 2023.06.01 |
---|---|
[빅데이터를 지탱하는 기술] Chapter4.빅데이터의 축적 - (1) (0) | 2023.06.01 |
[빅데이터를 지탱하는 기술] Chapter3.빅데이터의 분산 처리 - (1) (0) | 2023.06.01 |
[빅데이터를 지탱하는 기술] Chapter2.빅데이터의 탐색 - (2) (0) | 2023.06.01 |
[빅데이터를 지탱하는 기술] Chapter2.빅데이터의 탐색 - (1) (0) | 2023.06.01 |