Hadoop/처리: Hive SQL

Error fixed: Hive bucket table map join data loss

Jr.Kelly 2022. 1. 13. 20:30

필요한 개념

1) Map join

특정 테이블의 데이터가 메모리에 모두 들어갈 수 있을 정도의 크기이면

(설정: hive.mapjoin.bucket.cache.size)

하이브는 각 매퍼에서 조인을 수행할 수 있도록 모든 데이터를 메모리에 로드한다.

 

이 쿼리 실행 잡은 레듀서가 필요없다. 

right join, full outer join에서는 제대로 작동하지 않는다.

일치의 부재는 전체 입력을 대상으로 집계(리듀스)를 수행하는 과정에서만 탐지할 수 있기 때문이다..

-> 결국 버킷 테이블/아닌테이블이 맵조인을 수행했을 때 이 쿼리의 집계결과에서 데이터 불일치가 발견되는 것은

집계 (리듀스) 수행과정에서만 탐지할 수 있기 때문이군..

 

왼쪽 테이블의 버킷을 처리하는 맵퍼는 조인을 수행할 때 테이블의 관련 버킷만 불러오면 된다. 

 

맵 조인을 사용하려면 다음과 같이 최적화 설정을 활성화 해두어야한다.

set hive.optimize.bucketmapjoin = true;

 

2) Bucket

테이블을 버킷으로 구조화하는 이유

-효율적인 쿼리가 가능하다. 버킷팅은 테이블에 대한 추가 구조를 부여하여 버킷된 테이블 끼리 맵조인 수행시 효율적이다.

-효율적인 샘플링에 유리하다.

 

CREATE TABLE bucketed_users (id int, name string)

CLUSTERED BY (id) INTO 4 BUCKETS;

 

하이브는 아이디를 해싱하고 그 값을 버킷수 4개로 나눈 나머지를 버킷의 번호로 선택.

 

3) 설정값 

ambari > hive > configs >advanced

 

hive.auto.convert.join = False

hive.auto.convert.join.noconditionaltask = true

hive.optimize.bucketmapjoin.sortedmerge = False

hive.auto.convert.join.noconditionaltask.size = 

 

hive.convert.join.bucket.mapjoin.tez = False

hive.mapjoin.bucket.cache.size = 10000

hive.optimize.bucketmapjoin = true

hive.enforce.sortmergebucketmapjoin = true

hive.optimize.bucketmapjoin.sortedmerge = False

 

데이터 누락 확인 상황

-Bucket 테이블과 Bucket 아닌 테이블간의 조인시 조인이 제대로 되지 않음.

-select * bucket table join unbucket table on id 로 조인을 시도하면,

조인 결과 count(*)시 아래 모두 개수는 동일함.

버킷 테이블, 버킷 아닌 테이블 mapjoin한 결과 - case1

버킷 아닌 테이블, 버킷 아닌 테이블 map join한 결과 - case2

버킷 테이블, 버킷 테이블  map join한 결과 - case3

-하지만 버킷 테이블을 생성할 때 clustered by (column) 으로 지정한 조인 컬럼에 특정 값으로 조회를 하면 join한 전체 결과 count(*), select * 해보면 case2,3에서는 조회되지만 case1에서는 조회되지 않음

 

 

결국에 버킷 테이블은 버킷 테이블끼리 map join을 해야지 clustered by 된 컬럼을 기준으로 조인 결과 조회가 정상적으로 되는 것같다.