일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Spark
- Deeplearning 키워드
- DeepLearning
- 선형 회귀
- 학습률
- 차원의 저주
- Spark 설치
- learning rate
- Clodera Quick Start
- hive
- Manifold Learning
- 스파크
- L2 정규화
- Hadoop Ecosystems
- Spark Data 불러오기
- 캐글
- Tez
- .hiverc
- Feature extraction
- Haddop
- Hive CLI
- 딥러닝
- Over fitting
- 하이브
- Auto Encoder
- Managed Table
- data load
- One-hot encoding
- hive setting
- Data 불러오기
- Today
- Total
남는건 기록뿐
Hive Partition, Bucketting에 대하여 본문
Partition
파티션은 데이터를 디렉토리로 분리하여 저장한다. 하이브 같은 파일 기반 테이블은 기본적으로 테이블의 모든 row 정보를 읽기 때문에 데이터가 많아지면 속도가 느려진다. 파티션 칼럼은 where 조건에서 칼럼 처럼 이용할 수 있기 때문에 처음에 읽어 들이는 데이터를 줄여서 처리 속도를 향상 시켜 준다. 테이블의 파티션을 생성하는 기본 문법은 다음과 같다.
CREATE TABLE tbl( order_id STRING ) PARTITIONED BY (yymmdd STRING);
Partiton 종류
파티션의 종류는 동적 파티션(dynamic)과 고정 파티션(static)이 있다.
고정 파티션은 테이블에 데이터를 입력하는 시점에 파티션 정보를 전달하기 때문에 입력되는 파티션을 알 수 있다. 동적 파티션은 칼럼의 정보를 이용하여 동적으로 파티션이 생성되기 때문에 쿼리 시점에는 파티션을 알 수 없다. 데이터를 입력할 때 고정 파티션, 동적 파티션을 단독으로 이용할 수도 있고, 고정과 동적 파티션을 혼합하여 사용할 수도 있다.
동적 파티션(Dynamic)
동적 파티션을 이용한 데이터 입력은 INSERT문에 파티션 정보를 조회하는 칼럼을 전달하여 입력한다. 다음은 yymmdd 파티션에 yymmdd 칼럼을 전달하여 파티션을 동적으로 생성하는 예제이다.
INSERT INTO TABLE tbl(yymmdd) SELECT order_id, yymmdd FROM orders;
위와 같이 데이터를 입력할 때 temp 테이블의 yymmdd 칼럼에 20200616, 20200617 두 개의 데이터가 있으면 다음과 같이 생성한다.
hdfs://[tbl dir]/yymmdd=20200616/ hdfs://[tbl dir]/yymmdd=20200617/
하이브는 기본적으로 동적 파티션만 이용하는 것은 권장하지 않는다. 동적 파티션만 이용하기 위해서는 hive.exec.dynamic.partition.mode 설정을 nonstrict 로 변경해야 한다.
-- 동적 파티션만을 이용하여 데이터를 입력을 사용하기 위한 설정, 기본값은 strict 로 동적
SET hive.exec.dynamic.partition.mode=nonstrict;
동적 파티션을 사용하면 속도가 느려지기 때문에 동적 파티션의 생성 개수에 제한이 있다. 기본 설정보다 많은 파티션을 생성할 때는 다음의 설정을 해주어야 한다.
-- 동적 파티션 개수
SET hive.exec.max.dynamic.partitions=1000;
-- 노드별 동적 파티션 생성 개수
SET hive.exec.max.dynamic.partitions.pernode=100;
동적 파티션에 NULL 값이 들어가는 경우 하이브는 NULL 값을 기본 파티션 명을 이용해서 입력한다.
-- NULL 값의 기본 파티션 명
SET hive.exec.default.partition.name=__HIVE_DEFAULT_PARTITION__;
-- 아래와 같은 형태로 파티션이 생성
hdfs://temp/yymmdd=20200616/hh=00/
hdfs://temp/yymmdd=20200617/hh=__HIVE_DEFAULT_PARTITION__/
-- 해당 파티션을 조회할 때는 다음과 같이 사용
SELECT * FROM temp WHERE hh = '__HIVE_DEFAULT_PARTITION__';
고정 파티션(Static)
고정 파티션을 이용한 데이터 입력은 INSERT 문에 Partition 정보를 고정된 값으로 전달하여 입력한다. 다음은 yymmdd 파티션에 '20200617' 값을 직접적으로 전달하여 Partition을 생성하는 예제이다.
INSERT INTO TABLE tbl(yymmdd='20200617') SELECT order_id FROM orders;
위와 같이 데이터를 입력하면 다음과 같은 폴더 구조로 데이터를 생성한다.
hdfs://[tbl dir]/yymmdd=20200616/
Partition 수정/삭제
Partition의 수정, 삭제는 ALTER 문을 이용한다. Partition 삭제시 Managed Table인 경우 Partiton 위치의 데이터도 함께 삭제 되므로 주의해야 한다.
-- 신규 Partition 추가
ALTER TABLE employee ADD PARTITION (yymmdd='20200616');
-- Partition의 LOCATION 수정
ALTER TABLE employee PARTITION (yymmdd='20200616') SET LOCATION '/public/reatil_db/employees';
-- Partition 삭제
ALTER TABLE employee DROP PARTITION (yymmdd='20200616');
-- Partition 범위 삭제, 비교연산자를 이용해 범위 삭제 가능
ALTER TABLE employee DROP PARTITION (yymmdd < '20200616');
ALTER TABLE employee DROP PARTITION (yymmdd >= '20200616');
Partition 복구
Table 삭제, 추가로 인하여 신규 Table을 생성하고, 기존 데이터나 신규 데이터로 Table의 Partition을 복구해야 하는 경우 MSCK 명령을 이용한다. 많은 Partition을 한번에 복구하게 되면 작업시간이 늘어나서 연결시간 초과 등으로 오류가 발생할 수도 있다. 이 경우 hive.msck.repair.batch.size 를 양수 값으로 설정하여 한번에 처리할 Partition 개수를 설정해서 명령어를 여러번 돌리는 것이 좋다.
Partition에 허용되지 않는 문자나 Partition 규칙에 맞지 않을때 오류가 발생하는데, hive.msck.path.validation 옵션을 ignore 로 설정하여 오류를 무시하고 진행하게 하면 된다.
-- 0으로 설정하면 모든 Partition을 복구한다.
SET hive.msck.repair.batch.size=0;
-- Partition에 허용되지 않는 문자가 있으면 오류가 발생하는데, ignore 로 설정하면 무시하고 넘어간다.
SET hive.msck.path.validation=ignore;
-- Partition 복구
MSCK REPAIR TABLE employee;
버켓팅(Bucketting)
버켓팅은 지정된 칼럼의 값을 해쉬 처리하고 지정한 수의 파일로 나누어 저장한다. 조인에 사용되는 키로 버켓 칼럼을 생성하면, 소트 머지 버켓(SMB) 조인으로 처리되어 수행속도가 빨라진다. Partition은 데이터를 디렉토리로 나누어 저장하는 방식이고, Bucketting은 데이터를 파일별로 나누어 저장한다. 버켓팅 테이블을 생성하는 기본 문법은 다음과 같다.
예제는 내일!
'Hive & Impala' 카테고리의 다른 글
Hive Meta store의 역할 (0) | 2020.06.17 |
---|---|
.hiverc setting! (0) | 2020.06.17 |
Hive의 3 가지 Table Type, Data Load (0) | 2020.06.17 |
MR과 TEZ의 차이 (0) | 2020.06.16 |
Hive CLI(Command Line Interface) (0) | 2020.06.15 |