[데이터 플랫폼 운영 / 개발] - Hive Partitioning

Chan hae OH·2024년 4월 7일
0

Hive

목록 보기
4/6

1. 시작말


안녕하세요.

데이터 엔지니어링 & 운영 업무를 하는 중 알게 된 지식이나 의문점들을 시리즈 형식으로 계속해서 작성해나가며

새로 알게 된 점이나 잘 못 알고 있었던 점을 더욱 기억에 남기기 위해 글을 꾸준히 작성 할려고 합니다.

Hive 경우 하둡 완벽 가이드와 구글링, ChatGPT 를 참고하여 운영하고 있습니다.

반드시 글을 읽어 주실 때 잘 못 말하고 있는 부분은 정정 요청 드립니다.

저의 지식에 큰 도움이 됩니다. :)



2. Partitioning 이란?


테이블의 사이즈가 증가함에 따라 데이터를 관리하기 쉬운 단위로 적절히 분할하여 저장하는 기법을 말합니다.

Hive 의 경우 Partition key 는 컬럼 맨 뒤로 이동하여 지정 되며 아래와 같이 DDL 구문을 사용하여 partition table 을 만들 수 있습니다.

CREATE TABLE LAKE.TEST_TABLE(
	ID STRING,
    PASSWD STRING
)
PARTITIOINED BY (PART_KEY STRING)
STORED AS PARQUET;

파티션을 지정하여 저장하게 되면 HDFS 에는 아래와 같은 형태로 저장이 됩니다

TEST_TABLE
	|_ PART_KEY=VALUE
    |	|_file1.parquet
    |	|_file2.parquet
    |_ PART_KEY=VALUE
	|	|_file1.parquet
    |	|_file2.paquet
...

Hive 테이블의 partition 을 조회하고 싶을 때는 아래와 같이 구문을 지정하면 동작합니다.

SHOW PARTITIOINS TEST_TABLE

partitioin 을 추가하기 위해서는 아래와 같은 구문을 사용하여 파티션을 추가할 수 있습니다.

ALTER TABLE TEST_TABLE ADD PARTITION (PART_KEY=`202403`)

INSERT 작업을 수행할 때 월변경이 있을 경우에는 아래와 같이 지정할 수도 있습니다.

FROM TEST_TABLE_STAG
INSERT INTO TEST_TABLE PARTITION(PART_KEY='202404')
	SELECT *, '202404' AS PART_KEY



3. Partitioning 의 이점


Partitioning 을 지정하면 아래와 같은 이점이 있습니다.

  • 테이블 full scan 방지
    where 조건으로 partition key 를 지정했을 때 해당 파티션 디렉터리만 조회하기 때문에 조회 성능에 이점을 가져올 수 있습니다.
  • 테이블 용량 관리 용이
    테이블을 partitioning 했을 경우 파티셔닝 키를 기준으로 테이블 보관 기간을 정의할 수 있습니다.
    예를 들어 월 단위 파티션키를 가진 테이블이 있을 경우 아래와 같이 삭제를 진행할 수 있습니다.
    ALTER TABLE TEST_TABLE DROP PARTITION (PART_KEY='202403')



4. 동적 파티션 생성


Hive 에서는 동적 파티션 생성을 지원합니다.

동적 파티션이란 별도의 파티션 키 생성 구문 없이 Hive 가 알아서 파티션키의 신규 파티션을 데이터에 맞춰 생성하는 기능을 말합니다

아래의 hive.exec.dynamic.partition 옵션에 true 를 지정해주면 동적 파티션 생성을 수행합니다.

  • hive.exec.dynamic.partition : (ture | false) 동적 파티션 생성 지원 옵션

  • hive.exec.dynamic.partition.mode : (strict | nonstrict) 동적 파티셔닝 모드를 설정합니다. strict 모드에서는 적어도 하나의 정적 파티션을 지정해야 합니다. nonstrict 모드에서는 모든 파티션을 동적으로 지정할 수 있습니다.

  • hive.exec.max.dynamic.partitions : (1000) 하나의 작업에서 생성할 수 있는 최대 동적 파티션의 수를 설정합니다. 이 값을 통해 동적 파티셔닝으로 인한 잠재적인 메타데이터 폭증을 방지할 수 있습니다.

  • hive.exec.max.dynamic.partitions.pernode : (100) 단일 데이터 노드에서 생성할 수 있는 최대 동적 파티션 수를 제한합니다. 이 옵션도 메타데이터의 과도한 증가를 방지하는 데 도움이 됩니다.

예를 들어 위의 TEST_TABLE 의 partitioin key 를 part_key 로 지정했을 때 신규 part_key 값이 들어왔을 때 해당 파티션을 생성합니다.

hive.exec.dynamic.partition.modenonstrinct 로 지정했을 경우 spark 에서 insert 를 할 때 반드시 spark session 에서 아래와 같이 옵션을 지정해줘야합니다.

SparkSession \
	.builder \
    .appName('TEST_QUERY) \
    .config('hive.exec.dynamic.partition', 'true') \
    .config('hive.exec.dynamic.partition.mode', 'nonstrict') \
    .enableHiveSupport() \
    .getOrCreate()



5. 맺음말


Hive 에서 지원하는 Partitioning 에 대해 다시금 정리해봤습니다. 운영 시에도 데이터 조회는 많이 되는데, 조회 시 scan 할 데이터를 줄여 조회속도를 올릴 수 있는 방법 중 partitioning 은 정말 기본적으로 사용되어야 할 방법인듯 합니다.



profile
Data Engineer

0개의 댓글