Hadoop EcoSystem

[Hive] 테이블 - 버켓팅 (bucketing)

비번변경 2024. 2. 2. 18:31

개요

2024.01.19 - [Hive] 테이블 - 파티션에 이어서 이번 글에서는 hive 성능에 관련이 있는 버켓팅 개념에 대해서 간단히 이해해보려고 한다.

 

 

bucketing

bucketing의 기본 아이디어는 특정 컬럼에 대한 HASH 값을 기준으로 파일을 나눠서 저장하는 것이다. 달리 표현하면, 특정 컬럼의 값을 해시 처리한 후 지정한 수의 파일로 분리해서 저장하는 것이다.

bucketing을 사용하면 쿼리의 성능을 향상시킬 수 있다. 예로 들어 WHERE 조건에 버킷 컬럼을 사용하거나, 테이블 JOIN 시 bucket 기준 컬럼을 사용하면 해당 키의 해시값에 해당하는 버킷만 데이터를 스캐닝할 수 있기 때문이다.

 

 

테이블 버켓팅 설정

버켓팅은 테이블 생성 시 CLUSTERED BY ~ INTO n BUCKETS 구문으로 지정할 수 있다.

CREATE TABLE buckted_table (
  col1 STRING,
  col2 STRING
) CLUSTERED BY (col2) INTO 20 BUCKETS
LOCATION '/user/bucketed_table/'
;

위의 쿼리는 col2의 해시값을 기준으로 20개 파일에 나눠서 저장한다. 보통 SORT BY도 함께 사용하는 것 같다.

CREATE TABLE buckted_table (
  col1 STRING,
  col2 STRING
) CLUSTERED BY (col2) SORTED BY col2 INTO 20 BUCKETS
LOCATION '/user/bucketed_table/'

 

버켓팅 설정을 적용한 테이블에 데이터를 추가하면 아래와 같은 방식으로 데이터가 저장된다.

$ hadoop fs -ls /user/bucketed_table/
Found 20 items
-rwxr-xr-x   2 hadoop hadoop      55246 2018-11-08 05:22 /user/bucketed_table/000000_0
-rwxr-xr-x   2 hadoop hadoop        101 2018-11-08 05:22 /user/bucketed_table/000001_0
-rwxr-xr-x   2 hadoop hadoop       2227 2018-11-08 05:22 /user/bucketed_table/000002_0
-rwxr-xr-x   2 hadoop hadoop    3171874 2018-11-08 05:22 /user/bucketed_table/000003_0
-rwxr-xr-x   2 hadoop hadoop         65 2018-11-08 05:22 /user/bucketed_table/000004_0
-rwxr-xr-x   2 hadoop hadoop     102704 2018-11-08 05:22 /user/bucketed_table/000005_0
-rwxr-xr-x   2 hadoop hadoop          0 2018-11-08 05:22 /user/bucketed_table/000006_0
-rwxr-xr-x   2 hadoop hadoop     636043 2018-11-08 05:22 /user/bucketed_table/000007_0
-rwxr-xr-x   2 hadoop hadoop         92 2018-11-08 05:22 /user/bucketed_table/000008_0
-rwxr-xr-x   2 hadoop hadoop         42 2018-11-08 05:22 /user/bucketed_table/000009_0
-rwxr-xr-x   2 hadoop hadoop     379097 2018-11-08 05:22 /user/bucketed_table/000010_0
-rwxr-xr-x   2 hadoop hadoop     148419 2018-11-08 05:22 /user/bucketed_table/000011_0
-rwxr-xr-x   2 hadoop hadoop      49212 2018-11-08 05:22 /user/bucketed_table/000012_0
-rwxr-xr-x   2 hadoop hadoop       1866 2018-11-08 05:22 /user/bucketed_table/000013_0
-rwxr-xr-x   2 hadoop hadoop       2082 2018-11-08 05:22 /user/bucketed_table/000014_0
-rwxr-xr-x   2 hadoop hadoop        123 2018-11-08 05:22 /user/bucketed_table/000015_0
-rwxr-xr-x   2 hadoop hadoop       1268 2018-11-08 05:22 /user/bucketed_table/000016_0
-rwxr-xr-x   2 hadoop hadoop     834307 2018-11-08 05:22 /user/bucketed_table/000017_0
-rwxr-xr-x   2 hadoop hadoop       3631 2018-11-08 05:22 /user/bucketed_table/000018_0
-rwxr-xr-x   2 hadoop hadoop         62 2018-11-08 05:22 /user/bucketed_table/000019_0

 

 

bucketing VS partition

bucketing처럼 데이터를 나눠서 저장하는 방법으로 partition이라는 개념이 존재하는데, 두 개념의 차이는 다음과 같다.

  • bucketing : 데이터를 지정한 수의 파일로 나눠서 저장한다.
  • partition : 데이터를 디렉터리 별로 나눠서 저장한다.

 

 

참고 문서

https://gyuhoonk.github.io/bucket-hive-spark

https://wikidocs.net/23469#_5

https://wikidocs.net/23558