티스토리 뷰

반응형

external table 로 테이블을 만들어 관리할때, table 이름을 rename 해도, 폴더가 테이블명에 맞춰서 수정되지 않는다.

그렇다고 테이블의 location 속성의 경로를 수정해도, 파티션 테이블인 경우 인지가 안되는 문제가 존재한다.

 

location 까지 세트로 변경이 안되면, hdfs 에서 직접 데이터를 바라보는 사람은 테이블명과 다르면 혼란이 올 수 있기 때문에 완벽하게 테이블명과 location 의 폴더명도 세트로 변경하고 싶은 경우를 의미한다.

 

문제예시

예를 들면 아래와 같다. location 폴더를 백업폴더로 이동하고, table 의 location 을 이동시킨 폴더로 변경하더라도 바로 조회되지 않는다. 테이블이 아닌 파티션별 location 을 변경해야 한다. 문제는 이런 파티션이 수백개라면 어떻게 할까???

 

아래 예제는, test 라는 테이블을 test_backup 으로 이름을 바꾸고, location 도 test 를 test_backup 과 같이 테이블명과 일치화 시키려고 하는데 잘 안되는 예제이다.

------------------------
-- 1. 샘플 테이블 생성
------------------------
USE sample;

CREATE EXTERNAL TABLE IF NOT EXISTS test (
   my_id string
)
PARTITIONED BY (ymd string, hh24mi string)
 STORED AS ORC
 TBLPROPERTIES ('orc.compress'='ZLIB')
;


INSERT OVERWRITE TABLE test PARTITION(ymd='2023-01-01', hh24mi='0000')
SELECT '1' as my_id ;

INSERT OVERWRITE TABLE test PARTITION(ymd='2023-01-01', hh24mi='0010')
SELECT '2' as my_id ;

INSERT OVERWRITE TABLE test PARTITION(ymd='2023-01-01', hh24mi='0020')
SELECT '3' as my_id ;

INSERT OVERWRITE TABLE test PARTITION(ymd='2023-01-02', hh24mi='0000')
SELECT '11' as my_id ;


+-------------+-------------+--------------+
| test.my_id  |  test.ymd   | test.hh24mi  |
+-------------+-------------+--------------+
| 1           | 2023-01-01  | 0000         |
| 2           | 2023-01-01  | 0010         |
| 3           | 2023-01-01  | 0020         |
| 11          | 2023-01-02  | 0000         |
+-------------+-------------+--------------+

------------------------------------
-- 2. hive 테이블명 변경 (test -> test_backup)
-- 하지만 폴더가 변경되는건 아니다.
------------------------------------
alter table test rename to test_backup;


------------------------------------
-- 3. hdfs 의 파일을 test_backup 폴더로 이동
------------------------------------
$ hadoop fs -mv hdfs://myservice/user/foo/warehouse/sample.db/test hdfs://myservice/user/foo/warehouse/sample.db/test_backup
$ hadoop fs -ls hdfs://myservice/user/foo/warehouse/sample.db/test_backup
Found 2 items
drwx------   - foo hadoop          0 2023-11-29 18:06 hdfs://myservice/user/foo/warehouse/sample.db/test_backup/test_backup/ymd=2023-01-01
drwx------   - foo hadoop          0 2023-11-29 18:06 hdfs://myservice/user/foo/warehouse/sample.db/test_backup/test_backup/ymd=2023-01-02

------------------------------------
-- 4. hive table location 변경
------------------------------------
USE sample;

-- 단순히 location 을 변경한다고 데이터가 조회되지 않는다.
alter table test_backup set location 'hdfs://myservice/user/foo/warehouse/sample.db/test_backup';
select * from test_backup;
+-------------+-----------+--------------+
| test_backup.my_id  | test_backup.ymd  | test_backup.hh24mi  |
+-------------+-----------+--------------+
+-------------+-----------+--------------+

-- 수동으로 파티션별 location 을 변경해야 데이터가 조회된다. 
-- (즉, 파티션의 물리경로 정보가 메타스토어에 있을텐데 이 정보도 변경이 필요하다는말)
alter table test_backup partition (ymd='2023-01-01', hh24mi='0000') set location 'hdfs://myservice/user/foo/warehouse/sample.db/test_backup/ymd=2023-01-01/hh24mi=0000';
+-------------+-------------+--------------+
| test_backup.my_id  |  test_backup.ymd   | test_backup.hh24mi  |
+-------------+-------------+--------------+
| 1           | 2023-01-01  | 0000         |
+-------------+-------------+--------------+

 

해결방법

수동으로 파티션별 location 을 변경하기는 너무 손이 많이 간다. (위 예제에서는 파티션이 4개지만, 만약 1000개가 넘는다면??)

그래서 단순 반복 하는 방법보다 더 효율적인 방법이 존재한다. 바로 msck 라는 명령어이다.

다음과 같이 external table 이라면 파티션 정보를 날려주고, msck (MetaStore ChecK) 명령으로 Hive metastore 에 파티션정보가 저장되어있지 않을때, 테이블을 수리하는 작업을 한다는 말이다. (메타스토어의 정보 재생성)

-- 기존 파티션 정보를 없애야한다. (여기서는 external table 이므로 실제 파일이 삭제되진 않는다)
alter table test_backup drop partition(ymd>='0000-00-00' , hh24mi >= '0000');

-- 파티션 정보를 메타스토어에 복구처리한다.
msck repair table test_backup;

 

이렇게 명령어를 날리면, 수동으로 파티션별 location 지정없이 모든 파티션에 대한 수리(?)가 완료된다.

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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 31
글 보관함