본문 바로가기

DATA SCIENCE/DATA ENGINEERING

[Hadoop] Hive란? (Hive 아키텍쳐 및 데이터모델 / HiveQL / SQL on Hadoop)

최근 약 5억건의 데이터를 저장하고 빠르게 다루기 위한 방법을 찾아보던 중, 말로만 들어보던 Hive를 한번 시도해보게 되었다.
HDFS에 데이터를 올려두기만 하면 다른 데이터베이스에 적재시키는 것보다 훨씬 빠르게 처리되는걸 볼 수 있었는데..!
Hive는 어떻게 동작하길래 이렇게 빠르게 처리될 수 있는지 내부 구조를 알아보고자 한다.

 

Hive란?

https://hive.apache.org/

Hive 공식 페이지에 따르면, Hive는 '대규모 분석을 지원하는 분산형 내결함성 데이터 웨어하우스 시스템 (a distributed, fault-tolerant data warehouse system that enables analytics at a massive scale)'이라고 한다.

Hadoop에서는 기본적으로 데이터를 HDFS라는 파일 분산 시스템을 통해 다루는데,
해당 파일을 다루기 위해서는 MapReduce 작업으로 처리해야만 했다.
(매번 파일을 확인할 때 맵리듀스 스크립트를 짜야 한다니 생각만 해도 번거롭다..)

페이스북에서 이러한 불편함을 해소하고자
매일 소셜 네트워크를 통해 생산되는 대규모 데이터를 SQL 쿼리를 통해 보다 편리하게 관리하고 학습하기 위해,
https://github.com/apache/hive 과 같이 오픈소스로 Hive를 개발하였다.

 

Hive 아키텍쳐

Hive의 기본적인 원리는 HDFS에 저장된 데이터에 스키마를 입히는 방식으로 데이터를 테이블로 구조화하게 되는데,
한번 내부 아키텍쳐를 통해 좀 더 구체적으로 살펴보고자 한다.

https://cwiki.apache.org/confluence/display/Hive/Design (https://hive.apache.org/docs/latest/design_27362072/)

먼저 Hive 구성 요소는 다음과 같다.

  • UI
    : 사용자가 쿼리 작업 등을 제출할 수 있는 인터페이스로, CLI 나 웹 UI, JDBC/ODBC 를 통해 접근할 수 있다. (Zeppelin 등을 통해서 쿼리를 호출할 수 있다.)
  • 드라이버 (Driver)
    : UI를 통해 입력된 쿼리를 수신하는 컴포넌트로, JDBC/ODBC 인터페이스에서 모델링된 API를 실행하고 가져오는 역할을 한다.
  • 컴파일러 (Compiler)
    : 쿼리를 파싱한 뒤, 쿼리 블록과 표현식에 대한 분석을 통해 실행 계획을 생성한다. 생성 시 메타스토어에서 조회한 테이블과 파티션 정보를 기반으로 한다.
  • 메타스토어 (Metastore)
    : 테이블 스키마와 같은 테이블과 파티션에 관련된 구조 정보를 저장하는 요소이다. 각 테이블의 컬럼 및 컬럼 유형 정보, 데이터를 읽고 쓰기 위한 serializer / deserializer, 데이터 저장 HDFS 파일 위치 등을 저장하고 있다.
  • 실행 엔진 (Execution Engine)
    : 컴파일러가 생성한 실행 계획을 수행해주는 컴포넌트로, DAG의 각 단계 사이의 종속성을 관리하고 적절한 시스템 컴포넌트에서 단계를 실행해준다.

해당 구성요소를 기반으로 Hive 내 쿼리 입력 시 처리되는 과정을 살펴보자면,

  1. 쿼리 실행 (executeQuery: UI → Driver)
    : UI를 통해 입력된 쿼리를 Driver에 전송한다.
  2. 계획 요청 (getPlan: Driver Compiler)
    : Driver가 Compiler를 통해 해당 쿼리에 대한 계획을 생성하도록 명령한다.
  3. 메타데이터 요청 (getMetaData: Compiler → Metastore)
    : Compiler가 Metastore에 관련 메타데이터를 요청한다.
  4. 메타데이터 전송 (sendMetaData: Metastore → Compiler)
    : Metastore에서 필수 메타데이터를 Compiler에게 전송한다.
    해당 메타데이터는 쿼리 트리의 표현식을 typecheck 하고, 쿼리 predicate을 기반으로 파티션을 pruning 하는데에 사용한다.
  5. 계획 전송 (sendPlan: Compiler → Driver)
    : 위 메타데이터와 함께 Compiler에 의해 생성된 계획을 Driver에서 수행될 수 있도록 전송한다.
    여기에서 계획은 각 단계별로 맵리듀스 및 메타데이터 연산, HDFS 연산 등으로 구성된 DAG 이다.
  6. 계획 실행 (executePlan: Driver Execution Engine)
    : Execution Engine에서 각 단계별로 적절한 컴포넌트에 작업을 제출하며 계획이 실행된다.
    각 mapper/reducer에서 테이블 또는 중간 결과물을 deserializer를 통해 읽은 후, 연관 연산자 트리에 전달한다.
    최종 결과물이 나오면 serializer를 통해 임시 HDFS 파일에 작성되고, 다음 map/reducer 단계에 데이터 제공 시 사용된다.
    마지막 DML(Data Manipulation Language) 작업일 경우 최종 임시 파일이 해당 테이블 위치로 이동되는 방식으로 최종 결과물이 생성된다.
  7. 결과 불러오기 (fetchResults: UI ← Driver)
    : UI와 Driver가 주고받으며 6번에서 처리된 결과를 불러오고,
  8. 결과 전송 (sendResults: Driver Execution Engine)
    : Driver와 Execution Engine이 주고받으며 요청된 결과를 전송한다.
  9. 결과 불러오기 (fetchResults: Execution Engine ← Hadoop)
    : 마지막으로 Execution Engine과 Hadoop이 결과를 주고받으며 최종 결과를 전송해준다.
    (사실상 7~9번 단계가 같이 이루어져 결과가 UI로 최종 전달된다고 볼 수 있다.)

 

Hive 데이터모델

그렇다면 이렇게 처리되는 Hive에서 데이터는 어떻게 구성되어 있을까?
주로 아래와 같이 3가지 구성요소로 살펴볼 수 있다.

  • 테이블 (Table)
    : Hive의 테이블은 관계형 데이터베이스의 테이블과 거의 비슷하며, filter / project / join / union 등의 연산이 가능하다.
    RDBMS와 약간 다른점은
    1) 테이블의 모든 데이터가 HDFS 경로에 저장된다는 것이다.
    2) 외부 테이블(External Table)이라는 개념이 존재하는데,
    테이블 생성 DDL(Data Definition Language) 시 HDFS 새로운 경로가 아닌 기존 파일이 존재하는 경로에 테이블을 생성한다.
  • 파티션 (Partition)
    : 각 테이블별로 데이터 저장 방식을 결정하는 1개 이상의 partition key를 가질 수 있으며, 각 파티션 별로 데이터가 나누어 저장될 수 있다. 이러한 파티션을 통해 쿼리 predicate에 따라 검사할 데이터를 pruning 할 수 있다.
    (ex: 테이블 T 내에 날짜 관련된 컬럼 ds가 있을 경우, T.ds = '2025-03-02' 를 만족하는 행을 찾기 위해서는 HDFS에서 /ds=2025-03-02/ 경로 파일만 찾아보면 된다.)
  • 버킷 (Bucket)
    : 각 파티션 데이터는 열에 대한 해시에 따라 버킷을 나눌 수 있으며, 각 버킷은 파티션 경로에 파일로 저장된다.
    버킷을 통해 특히 SAMPLE 절을 사용하는 쿼리에 대해 효율적으로 쿼리를 수행할 수 있다.

 

HiveQL

Hive는 RDBMS에서 사용하던 일반적인 SQL과 거의 유사하게 HiveQL을 통해 데이터를 다룰 수 있다.

약간의 차이점이 있다면
1) 기존에는 데이터 수정 작업이 지원되지 않았으나 버전 0.14 부터 INSERT, UPDATE, DELETE 구문 처리가 가능해졌으며,
2) SQL은 구체화된 뷰(Materialized View: 쿼리 결과 물리적으로 저장)와 비구체화된 뷰(Standard View: 쿼리 자체만 저장)을 모두 제공하지만, HiveQL은 읽기 전용 뷰만 지원하여 비구체화된 뷰(Standard View)만 제공한다.

HiveQL을 작성한 파일 기반으로 실행하기 위해서는 hive -f filename.hql 와 같이 .hql 파일에 쿼리를 정의한 뒤 실행할 수 있으며,
HiveQL에 대한 보다 자세한 내용은 아래 Documentation에서 확인할 수 있다.

 

Apache Hive : LanguageManual

 

hive.apache.org

 

SQL on Hadoop 비교

Hadoop에서 SQL 쿼리를 실행할 수 있도록 지원하는 다른 도구는 어떤 것이 있을까?
가장 대표적으로는 Apache Impala가 있다.

 

Impala

Do BI-style Queries Impala provides low latency and high concurrency for BI/analytic queries on the Hadoop ecosystem, including Iceberg, open data formats, and most cloud storage options. Impala also scales linearly, even in multitenant environments. Unify

impala.apache.org

Hive와의 큰 차이점이라고 한다면 Hive는 배치 처리에 최적화되어 있고, Impala는 실시간 대화형 쿼리를 위해 설계되어 있다.
Hive는 MapReduce를 기반으로 디스크 기반 처리를 진행하는 방면,
Impala는 자체적인 병렬 처리 아키텍처를 활용하여 메모리 기반으로 처리한다.

따라서 대량 데이터를 일괄 배치 처리를 목적으로 한다면 Hive를,
실시간으로 빠르게 데이터를 조회하는 대화형 쿼리를 처리해야 한다면 Impala가 권장된다.

추후 각 상황별 니즈에 맞게 Hive나 Impala 등을 사용하여
친숙한 SQL을 통해 Hadoop에서 데이터를 더욱 편하게 다룰 수 있으면 좋을 것 같다 :)

 

References

 

Apache Hive : Design

Apache Hive : Design This page contains details about the Hive design and architecture. A brief technical report about Hive is available at hive.pdf. Figure 1 Hive Architecture Figure 1 shows the major components of Hive and its interactions with Hadoop. A

hive.apache.org

 

하둡 완벽 가이드 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

Hive란? - Apache Hive 설명 - AWS

Amazon EMR은 가장 쉽고 빠르며 비용 효율적인 관리형 Hadoop 프레임워크를 제공하여 고객이 동적으로 확장 가능한 EC2 인스턴스에서 방대한 양의 데이터를 처리할 수 있도록 합니다. 또한 고객은 EMR

aws.amazon.com

 

Hive에서 실시간으로 쇼핑 데이터를 조회할 수 있게 ETL 개선하기

들어가며 안녕하세요. Global EC(Global E-Commerce, 이하 GEC)에서 쇼핑 개발을 담당하고 있는 김성도입니다. LINE 쇼핑에서는 실시간으로 상품 정보를 업데이트할 수 있는 LINE 쇼핑 플랫폼을 사용해 모든

engineering.linecorp.com

 

반응형