하이브(hive)란 무엇인가

seoyeon hwang
4 min readJul 10, 2022

--

이번 글은 하둡 에코시스템 중 하나인 hive에 대한 글이다. 회사에서 hive를 사용하고 있지만 대충 사용 문법만 알고있어서 이번 기회에 정의, 아키텍쳐 등 정리해보려고 한다 :)

정의

hive는 하둡에 저장된 데이터를 쉽게 처리할 수 있는 데이터웨어하우스 패키지이다. 하이브를 사용하면 하둡에 저장된 데이터를 SQL과 유사한 하이브QL로 처리할 수 있기 때문에 파이썬을 배우지 않아도 쉽게 데이터를 조회/분석할 수 있다는 장점이 있다.

아키텍쳐

하이브 아키텍쳐

하이브는 크게 하이브 클라이언트, 메타스토어, 드라이버 3가지 요소로 구성되어있다.

1) 하이브 클라이언트

하이브 클라이언트는 하이브 서비스를 이용할 수 있도록 제공하는 접근 방법으로 CLI, 웹 인터페이스, 하이브 서버가 제공된다. 이때 하이브 서버의 경우 JDBC, ODBC, 쓰리프트를 통해 접근할 수 있다.

2) 메타스토어

메타스토어는 하이브에서 사용하는 저장소로, 하둡에서 처리된 메타데이터의 구조를 메타스토어에 저장한다. 따라서 하이브는 HDFS에 저장된 파일에 직접 접근해서 처리하지 않고, 메타스토어에 저장된 테이블을 분석한다.

아파치 더비, 오라클, mysql 등 JDBC를 지원하는 모든 데이터베이스를 이용해서 메타스토어를 구축할 수 있다. 기본적으로는 아파치 더비디비를 사용하고,다른 DBMS를 메타스토어로 사용하려면 hive-site.xml을 수정해야 한다.

3) 드라이버

드라이버는 사용자가 입력한 하이브QL을 분석한 후, 맵리듀스 잡으로 생성해서 실행한다. 하둡과 연결되어 하이브QL문의 실행 계획을 작성하고, 최적화 작업과 함께 쿼리문을 실행한다.

하이브QL

하이브는 SQL문과 매우 유사한 하이브QL을 제공한다. SQL문과 다른 점은 아래와 같다.

  • 하이브에 사용하는 데이터는 HDFS에 저장되고, HDFS는 한번 더장된 파일을 수정할 수 없기 때문에 UPDATE, DELETE 문을 사용할 수 없다.
  • FROM 절에서만 서브 쿼리를 사용할 수 있다.
  • SELECT 문을 사용할 때 HAVING 절을 사용할 수 없다.
  • 조인 서술자로 등호(=)를 사용하는 EQ 조인만 사용할 수 있다.
  • FROM 절에 테이블 하나만 지정할 수 있다.

하이브는 효율적인 쿼리문 수행을 위해 파티션과 버킷을 제공한다. 둘 다 데이터를 나눠서 저장한다는 측면은 동일하지만, 파티션은 특정 컬럼의 값을 기준으로 버킷은 지정된 개수의 파일로 분리해서 저장한다는 점이 다르다.

1) 파티션

하이브는 쿼리문의 수행 속도를 향상시키기 위해 PARTITION BY (컬럼명 컬럼타입)통해 파티션을 설정할 수 있다. 파티션을 설정하면 해당 테이블의 데이터를 파티션별로 디렉터리를 나눠서 저장하고, 파티션 키는 테이블 새로운 컬럼으로 추가된다.

파티션에는 고정 파티션과 동적 파티션이 있다. 고정 파티션이란 말 그대로 데이터를 입력할 때 파티셔닝할 컬럼 이름과 값을 함께 설정하는 것을 의미한다. 사용자가 파티션 컬럼값을 미리 모르는 경우에는 동적 파티션을 사용할 수 있다. 해당 기능을 사용하기 위해서는 아래 두 설정값을 활성화하고 PARTITION 절 뒤에 컬럼명만 설정하면 된다.

  • set hive.exec.dynamic.partition.mode=nonstrict;
  • set hive.exec.dynamic.partition=true;

2) 버킷

하이브는 효율적인 쿼리를 위해 버킷이라는 데이터 모델을 제공한다. 버킷은 버킷 컬럼 해시를 기준으로 데이터를 지정된 개수의 파일로 분리해서 저장하고, CLUSETERED BY (컬럼명) INTO 버킷개수 BUCKETS 통해 설정할 수 있다.

조인키로 버킷을 생성하면 필요한 버킷만 조회하면 되기 때문에 풀스캔을 하지 않아 빠르게 작업을 처리할 수 있다. 또한 TABLESAMPLE 절을 이용하여 데이터 샘플링을 할 수 있다.

데이터 저장 포맷

하이브의 데이터 저장 포맷은 파일 포맷과 레코드 포맷으로 구분된다.

1) 레코드 포맷

레코드 포맷은 컬럼 값이 레코드 내에서 인코딩되는 방식을 의미한다. 하이브에서는 레코드 내에 인코딩되어있는 데이터를 처리하기 위해 SerDe를 제공한다. INSERT/CREATE 문을 실행할때는 Serialize를, SELECT문을 실행할 때는 Deserialize를 수행한다.

2) 파일 포맷

파일 포맷은 파일에 레코드를 저장할 때 인코딩되는 방식을 의미한다. 텍스트, 시퀀스 RC 파일, ORC 파일, 파케이를 지원한다. 데이터의 크기 및 성능을 고려해서 적절한 파일 포맷을 설정해야 한다.

여러가지 포맷 중 회사에서는 파케이를 사용하여 데이터를 저장하고 있다. 파케이의 장점은 아래와 같다.

  • 컬럼 기반 저장 방식으로 필요한 컬럼만 조회할 수 있기 때문에 조회 속도가 빠르다.
  • map, struct 타입 같은 중첩 구조의 컬럼을 저장할 수 있다.
  • 다른 포맷과 비교하여 압축율이 높다.

--

--

seoyeon hwang
seoyeon hwang

Written by seoyeon hwang

데이터 보는거 좋아해요

Responses (1)