안녕하세요.
데이터 엔지니어링 & 운영 업무를 하는 중 알게 된 지식이나 의문점들을 시리즈 형식으로 계속해서 작성해나가며
새로 알게 된 점이나 잘 못 알고 있었던 점을 더욱 기억에 남기기 위해 글을 꾸준히 작성 할려고 합니다.
Hive 경우 하둡 완벽 가이드와 구글링, ChatGPT 를 참고하여 운영하고 있습니다.
반드시 글을 읽어 주실 때 잘 못 말하고 있는 부분은 정정 요청 드립니다.
저의 지식에 큰 도움이 됩니다. :)
테이블의 사이즈가 증가함에 따라 데이터를 관리하기 쉬운 단위로 적절히 분할하여 저장하는 기법을 말합니다.
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
Partitioning 을 지정하면 아래와 같은 이점이 있습니다.
ALTER TABLE TEST_TABLE DROP PARTITION (PART_KEY='202403')
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.mode
를 nonstrinct
로 지정했을 경우 spark 에서 insert 를 할 때 반드시 spark session 에서 아래와 같이 옵션을 지정해줘야합니다.
SparkSession \
.builder \
.appName('TEST_QUERY) \
.config('hive.exec.dynamic.partition', 'true') \
.config('hive.exec.dynamic.partition.mode', 'nonstrict') \
.enableHiveSupport() \
.getOrCreate()
Hive 에서 지원하는 Partitioning 에 대해 다시금 정리해봤습니다. 운영 시에도 데이터 조회는 많이 되는데, 조회 시 scan 할 데이터를 줄여 조회속도를 올릴 수 있는 방법 중 partitioning 은 정말 기본적으로 사용되어야 할 방법인듯 합니다.