본문 바로가기
Book & Lesson

[책정리] 빅데이터를 지탱하는 기술 3.2쿼리 엔진

by 카프리썬_ 2021. 6. 22.
728x90
728x90

6월 선정도서 - 빅데이터를 지탱하는 기술

선정계기 - 데이터가 쌓이고 흐르는 전체적인 구조를 깊이 있게 이해할 수 있고,

미래의 데이터엔지니어로써 해야하는 업무들의 전반적인 흐름을 파악할 수 있을 것 같아 선정(기대가 된다

 

목차 

챕터3. 빅데이터의 분산처리 

3-1. 대규모 분산처리의 프레임워크

3-2. 쿼리엔진

3-3. 데이터마트의 구축 

 

 Hive에 의한 구조화데이터의 생성과 Presto에 의한 대화식 쿼리


데이터마트 구축의 파이프라인

Hive와 Presto를 결합한 데이터프라인

비구조화(비정형) 데이터 -> 구조화(정형)데이터 -> 비정규화 데이터

1. 분산스토리지에 저장된 데이터를 구조화한다. (Hive)

2. 열지향 스토리지 형식으로 변환 및 저장

3. 완성한 구조화 데이터를 결합 및 집약하여 비정규화테이블을 만든다. (Presto or Hive)

4. 데이터마트로 내보낸다. 

 

Hive에 의한 구조화데이터 작성 및 저장 

외부테이블 : Hive의 외부에 있는 특정파일을 참고해 마치 거기에 테이블이 존재하는 것 처럼 읽는 방식 

예를 들어, csv파일의 테이블명을 참고해 데이터를 추출하고, 텍스트파일이 구조화 데이터로 변환된다. 

즉, CREATE EXTERNAL TABLE로 외부테이블을 정의한다.

 

열지향 스토리지 형식으로 변환 및 저장

Hive의 경우, 테이블마다 스토리지형식을 지정할 수 있따. 예를 들어 ORC형식,

ORC형식으로 변환하는데 다소 시간이 걸리지만, 변환하면 데이터를 집계하는 시간도 단축되고,파일크기도 줄어든다. 

즉, Hive에서 읽을 수 있는 형식이라면 쿼리를 이용해 어떤 테이블이라도 만들 수 있다.

 

비정규화테이블 만들기-Hive

Presto같은 대화형 쿼리엔진을 사용하거나, Hive같은 배치헝 쿼리엔진을 사용하거나.

원칙적으론 시간이 걸리는 배치는 Hive를 사용한다. 

비정규화테이블을 만드는데 오랜시간이 걸리는건 흔한일이라서 효율적인 쿼리를 작성해야한다. 

 

효율적인 Hive쿼리를 작성하는 방법?

Hive쿼리는 SQL과 유사하지만 특성은 RDB와 다르다. 

Hive는 데이터베이스가 아니라 데이터처리를 위한 배치처리구조. 

따라서 읽어들이는 데이터의 양을 의식하면서 쿼리를 작성해야한다. 

 

1) 서브쿼리 안에서 레코드 수 줄이기

서브쿼리가 꼭 필요하진 않지만, 가능한 서브쿼리 안에서 초기 팩트테이블을 작게 한다. 

예를 들어, 테이블을 결합하기 전에 서브쿼리안에서 데이터를 감소시켜 집계를 한뒤 group by라던가 join을 하여 결합

 

2) 데이터의 편향 방지하는 방법 

데이터의 편차 : 일부노드에 데이터가 집중되어 고속화를 방해.

order by구문이나 테이블의 결합에서 데이터편차가 발생하기 쉬움.

예를 들어 하나의 웹페이지가 다른 웹페이지에 비해 조회수가 많은데, 웹페이지당 고유방문자수를 알고 싶다면 하나의 웹페이지에 대한 distinct count가 극단적으로 늦어져 전체적으로 쿼리실행시간이 늘어난다. 

이러한 데이터의 편차를 최대한 없애고, 모든 노드에 데이터가 균등하게 분산되도록 해야한다. 

 

비정규화테이블 만들기-Presto 

작은 쿼리를 여러번 실행하는 대화형쿼리처리에는 Presto를 사용한다.

 

Presto 특징 

일반적인 MPP 데이터베이스에서는 스토리지와 컴퓨팅 노드가 결합되어 있어 처음에 데이터를 로드해야 집계가능

반면 Presto는 전용스토리지를 갖고 있지 않아 Hive와 마찬가지로 다양한 데이터소스에서 직접 데이터를 읽어옴 

 

1) 플러그인 가능한 스토리지 설계 

Hive 메타스토어에 등록된 테이블, CSV 같은 텍스트 데이터, Cassadra같은 NoSQL에 저장된 데이터 등

Presto로 바로 가져오고, ORC 형식의 로드에 최적화되어 있다. 

 

2) CPU 처리의 최적화

SQL실행에 특화. 쿼리를 분석하여 최적의 실행계획을 생성하고, 자바의 바이트코드로변환한다. 

CPU이용 효율이 높아 메모리와CPU 리소스만 충분하다면 데이터의 읽기속도가 쿼리의 실행시간을 결정한다.

코드의 실행은 멀티스레드화. 단일머신에서 수백 태스크나 병렬로 실행된다. 

Presto 쿼리는 일단 실행이 시작되면 중간에 끼어들 수 없어 너무 큰 쿼리를 실행해선 안된다. 

 

3) 인메모리 처리에 의한 고속화 

Hive와 달리 쿼리의 실행과정에서 디스크에 쓰기를 하지 않는다. 모든 데이터처리를 메모리상에서 실시.

메모리가 부족하면 여유가 생길때까지 기다리거나 오류. 디스크를 쓰는 것은 쓸데없는 오버헤드.

 

대규모 배치처리나 거대한 결합 등 디스크가 있어야하는 일부 데이터처리만 Hive에 맡기고

그 외에 단시간 쿼리실행에는 대부분 메모리상에서 실행가능한 Presto 대화형 쿼리엔진을 사용한다. 

 

4) 분산결합으로 인한 지연을 브로드캐스트결합으로 해결

분산결합 : 노드간 데이터 전송을 위해 네트워크 통신이 발생

2개의 팩트테이블 결합 등 테이블 결합은 분산결합으로 쿼리지연, 대량의 메모리 소비.

 

브로드캐스트 결합 : 결합하는 테이블의 모든 데이터가 각 노드에 복사되어 처리속도 고속화. 

처음에 한번만 복사하면 팩트테이블을 재배치할 필요가 없어져 테이블 결합이 빨라진다. 

 

5) 열지향 스토리지 집게

이로인해 Presto에서는 열지향 스토리지의 집계를 매우 빠르게 실행할 수 있다. 

 

이렇게 텍스트데이터를 구조화하고, 대화식으로 집계한 뒤, 다수의 컴퓨터에 배포하면 빅데이터를 집계할 수 있다. 


데이터분석의 프레임워크 

 

MPP 데이터베이스

  • 완성한 비정규화테이블을 고속으로 집계할때 또는 시각화를 위한 데이터마트로 사용하기 적합. 
  • 처음에 ETL 프로세스 등 데이터를 가져오는 절차가 필요. 이후 SQL만으로도 데이터집계 가능

 

Hive

  • 데이터양과 무관한 쿼리엔진 사용처럼 대규모 배치처리가 꾸준히 필요한 경우
  • 텍스트 데이터를 가공하거나 열지향스토리지를 만드는 시간이 오래걸리고 무거운 처리에 적합
  • Hive on Tez로 안정성을 보장한 대화형 쿼리에 적합  

 

 

Presto

  • Hive와 정반대로 쿼리속도가 빠르며, 쿼리엔진 속도에 영향을 받는다. 
  • 표준SQL을 준수하여 많은 데이터스토어에 대응, 일상적인 데이터분석에 주로 사용 
  • 대화식으로 특화된 쿼리엔진으로 ETL프로세스 및 데이터구조화에는 적합하지 않다.  

 

 

Spark

  • 오픈소스 분산처리 쿼리 및 실행엔진 
  • 인메모리 데이터처리가 중심 
  • 대화형 쿼리 실행에 적합 
  • ETL프로세스에서 SQL에 이르기까지 일련의 흐름을 하나의 데이터파이프라인으로 기술할 수 있다.
  • Hive에 의한 데이터구조화, Presto에 의한 SQL실행을 Spark가 한번에 처리 할 수 있는 것
728x90
반응형