| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- Kafka
- Data Engineer
- Apache Kafka
- 코엑스맛집
- 맛집
- 삼성역맛집
- Trino
- HDFS
- Iceberg
- bigdata engineer
- 코딩테스트
- Spark
- 코딩
- Linux
- HIVE
- 여행
- bigdata engineering
- 코테
- BigData
- 자바
- apache iceberg
- 알고리즘
- 백준
- 영어
- hadoop
- pyspark
- 개발
- 프로그래머스
- Data Engineering
- java
- Today
- Total
지구정복
[Hive] Hive Managed Table을 타클러스터로 옮기기 | How to migration the Hive Managed table from A Cluster to B Cluster 본문
[Hive] Hive Managed Table을 타클러스터로 옮기기 | How to migration the Hive Managed table from A Cluster to B Cluster
noohhee 2026. 1. 2. 13:50빠른 결론
Hive Managed Table이 insert-only인 경우에만 타클러스터에 Hive External Table로 옮기기 가능하나
타클러스터에서 디렉터리 구조 변경이 필요
1. A 클러스터의 Hive Table상태 조사
A클러스터에서 B클러스터로 옮겨야할 테이블명은 다음과 같다.
a_cluster.test_tbl1
a_cluster.test_tbl2
해당 테이블들의 show create table결과와 포맷도 확인한다.
-a_cluster.test_tbl1
| CREATE TABLE `a_cluster.test_tbl1`( `ecu_id` string, `dtc_cd` string, `fuel_k_cd` string) COMMENT 'Imported by sqoop on 2017/08/24 09:44:58' ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'field.delim'='', 'line.delim'='\n', 'serialization.format'='') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'hdfs://nameservice1/user/hive/warehouse/a_cluster.db/test_tbl1' TBLPROPERTIES ( 'bucketing_version'='2', 'transactional'='true', 'transactional_properties'='insert_only', 'transient_lastDdlTime'='1766957778') [root@my01mn001 ~]# hdfs dfs -ls /user/hive/warehouse/a_cluster.db/test_tbl1 Found 2 items -rw-rw-rw-+ 3 aaa hive 0 2025-12-29 05:36 /user/hive/warehouse/a_cluster.db/test_tbl1/_SUCCESS -rw-rw-rw-+ 3 aaa hive 5463113 2025-12-29 05:36 /user/hive/warehouse/a_cluster.db/test_tbl1/part-m-00000 |
-a_cluster.test_tbl2
| CREATE TABLE `test_tbl2`( `vin` string, `ignitiontime` timestamp, `brst_acc_cnt` bigint) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 'hdfs://nameservice1/user/hive/warehouse/a_cluster.db/test_tbl2' TBLPROPERTIES ( 'bucketing_version'='2', 'transactional'='true', 'transactional_properties'='insert_only') [root@my01ph00mn001 ~]# hdfs dfs -ls /user/hive/warehouse/a_cluster.db/test_tbl2 Found 1 items drwxrwxrwx+ - aaa hive 0 2025-12-29 03:44 /user/hive/warehouse/a_cluster.db/test_tbl2/delta_0000001_0000001_0000 [root@my01mn001 ~]# hdfs dfs -ls /user/hive/warehouse/a_cluster.db/test_tbl2/delta_0000001_0000001_0000 Found 21 items -rw-rw-rw-+ 3 aaa hive 172456 2025-12-29 03:44 /user/hive/warehouse/a_cluster.db/test_tbl2/delta_0000001_0000001_0000/000000_0 -rw-rw-rw-+ 3 aaa hive 173571 2025-12-29 03:44 /user/hive/warehouse/a_cluster.db/test_tbl2/delta_0000001_0000001_0000/000001_0 -rw-rw-rw-+ 3 aaa hive 181751 2025-12-29 03:44 /user/hive/warehouse/a_cluster.db/test_tbl2/delta_0000001_0000001_0000/000002_0 -rw-rw-rw-+ 3 aaa hive 174312 2025-12-29 03:44 /user/hive/warehouse/a_cluster.db/test_tbl2/delta_0000001_0000001_0000/000003_0 -rw-rw-rw-+ 3 aaa hive 180537 2025-12-29 03:44 /user/hive/warehouse/a_cluster.db/test_tbl2/delta_0000001_0000001_0000/000004_0 -rw-rw-rw-+ 3 aaa hive 181745 2025-12-29 03:44 /user/hive/warehouse/a_cluster.db/test_tbl2/delta_0000001_0000001_0000/000005_0 -rw-rw-rw-+ 3 aaa hive 170716 2025-12-29 03:44 /user/hive/warehouse/a_cluster.db/test_tbl2/delta_0000001_0000001_0000/000006_0 -rw-rw-rw-+ 3 aaa hive 181811 2025-12-29 03:44 /user/hive/warehouse/a_cluster.db/test_tbl2/delta_0000001_0000001_0000/000007_0 |
위와 같이 현재 두 테이블 모두 ORC포맷이 아닌 Hive Managed Table이기 때문에 insert_only 옵션이 붙은 테이블로 생성이 되었고, 실제로도 Insert DML만 가능하다.
이제 해당 테이블들의 데이터와 DDL Schame를 이용해서 B클러스터에서 아래 내용들을 테스트해본다.
* 같은 Schema와 Serde, I/O Format으로 생성되는지
* External로 생성했을 때와 Managed로 생성했을 때 차이(쿼리 동작 여부 등)
2. A 클러스터 Hive Table을 B 클러스터에 마이그레이션
이제 A클러스터에 있던 Hive Managed Table들의 데이터를 B 클러스터 HDFS에 같은 경로로 업로드 시켜준다.
그 전에 먼저 B클러스터에 Test를 위한 Hive database와 Table을 만들어준다.
이때 Table은 먼저 External Table로 생성해준다.
* test_tbl1
hive> create database test_mig_db; hive> show databases; +---------------------+ | database_name | +---------------------+ | default | | information_schema | | sys | | test_mig_db | +---------------------+ hive> use test_mig_db; hive> CREATE EXTERNAL TABLE `test_mig_db.test_tbl1`( `ecu_id` string, `dtc_cd` string, `fuel_k_cd` string) COMMENT 'Imported by sqoop on 2017/08/24 09:44:58' ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'field.delim'='', 'line.delim'='\n', 'serialization.format'='') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'hdfs://stg01/user/hive/warehouse/test_mig_db.db/test_tbl1'; hive> show tables; +--------------+ | tab_name | +--------------+ | test_tbl1 | +--------------+ |
다음으로 B클러스터 HDFS로 데이터를 put해준다.
| [user@my02gn001 ~]$ hdfs dfs -ls /user/hive/warehouse/ Found 6 items drwxrwxrwx+ - hive hive 0 2025-12-18 16:29 /user/hive/warehouse/example_table drwxrwxrwx+ - hive hive 0 2025-12-29 06:34 /user/hive/warehouse/hkgc_tms.db drwxrwxrwx+ - hive hadoop 0 2025-12-15 04:30 /user/hive/warehouse/information_schema.db drwxrwxrwx+ - platadmin hive 0 2025-12-22 10:26 /user/hive/warehouse/sample_table drwxr-xr-t+ - hive hadoop 0 2025-12-15 04:30 /user/hive/warehouse/sys.db drwxrwxrwx+ - hive hive 0 2025-12-29 06:32 /user/hive/warehouse/test_mig_db.db [user@my02gn001 ~]$ hdfs dfs -ls /user/hive/warehouse/test_mig_db.db/ Found 1 items drwxrwxrwx+ - hive hive 0 2025-12-29 06:42 /user/hive/warehouse/test_mig_db.db/test_tbl1 [user@my02gn001 ~]$ hdfs dfs -ls /user/hive/warehouse/test_mig_db.db/test_tbl1 [user@my02gn001 ~]$ ll total 2216 drwxr-xr-x 2 1116296 1116296 4096 Dec 29 06:15 test_tbl1 drwxr-xr-x 3 1116296 1116296 4096 Dec 29 06:17 test_tbl2 [user@my02gn001 ~]$ hdfs dfs -put test_tbl1/* /user/hive/warehouse/test_mig_db.db/test_tbl1 [user@my02gn001 ~]$ hdfs dfs -ls /user/hive/warehouse/test_mig_db.db/test_tbl1/ Found 2 items -rw-rw-rw-+ 3 1116296 hive 0 2025-12-29 06:42 /user/hive/warehouse/test_mig_db.db/test_tbl1/_SUCCESS -rw-rw-rw-+ 3 1116296 hive 5463113 2025-12-29 06:42 /user/hive/warehouse/test_mig_db.db/test_tbl1/part-m-00000 |
이제 hive select 쿼리로 조회가 가능한지 테스트해본다.
| hive> select * from test_mig_db.test_tbl1 limit 10 |
조회가 가능했다.
두 번째 테이블도 테스트 해본다.
| hive> CREATE EXTERNAL TABLE `test_mig_db.test_tbl2`( `vin` string, `ignitiontime` timestamp, `brst_acc_cnt` bigint) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 'hdfs://stg01/user/hive/warehouse/test_mig_db.db/test_tbl2'; [user@my02gn001 ~]$ hdfs dfs -ls /user/hive/warehouse/test_mig_db.db/ Found 2 items drwxrwxrwx+ - hive hive 0 2025-12-29 06:42 /user/hive/warehouse/test_mig_db.db/test_tbl1 drwxrwxrwx+ - hive hive 0 2025-12-29 06:56 /user/hive/warehouse/test_mig_db.db/test_tbl2 [user@my02gn001 ~]$ hdfs dfs -put test_tbl2/* /user/hive/warehouse/test_mig_db.db/test_tbl2/ [user@my02gn001 ~]$ hdfs dfs -ls /user/hive/warehouse/test_mig_db.db/test_tbl2/ Found 1 items drwxrwxrwx+ - a hive 0 2025-12-29 06:58 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000 [user@my02gn001 ~]$ hdfs dfs -ls /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/ Found 21 items -rw-rw-rw-+ 3 a hive 172456 2025-12-29 06:58 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000000_0 -rw-rw-rw-+ 3 a hive 173571 2025-12-29 06:58 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000001_0 -rw-rw-rw-+ 3 a hive 181751 2025-12-29 06:58 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000002_0 -rw-rw-rw-+ 3 a hive 174312 2025-12-29 06:58 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000003_0 -rw-rw-rw-+ 3 a hive 180537 2025-12-29 06:58 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000004_0 -rw-rw-rw-+ 3 a hive 181745 2025-12-29 06:58 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000005_0 -rw-rw-rw-+ 3 a hive 170716 2025-12-29 06:58 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000006_0 -rw-rw-rw-+ 3 a hive 181811 2025-12-29 06:58 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000007_0 -rw-rw-rw-+ 3 a hive 179337 2025-12-29 06:58 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000008_0 |
이때 Select 쿼리를 실행하면 실행은 되지만 데이터들이 보이지 않는다.
왜냐하면 hive external Table은 Location에 있는 데이터를 바로 읽기 때문이다.
현재 데이터는 hive managed table에서 옮긴 것이므로 delta_0000001_0000001_0000 디렉터리 하위에 존재한다.
| hive> select * from test_mig_db.test_tbl2 limit 10; |
아래 설정들을 암바리에 적용해도 똑같이 읽히지 않는다.
hive> set mapred.input.dir.recursive=true;
hive> set hive.mapred.supports.subdirectories=true;
따라서 transactional인 Hive Manged table(=base나 delta 디렉터리가 있는 Managed table)들을 같은 디렉터리 구조로 마이그레이션하는 것은 불가능하다.
base, delta안에 있는 데이터를 옮겨주거나 CTAS쿼리를 사용하는 방법밖에 없다.
아래는 delta 디렉터리에 안에 있는 특정 파일 하나를 LOCATION디렉터리에 옮겨놓고 select테스트를 해보았다.
| [user@my02gn001 ~]$ hdfs dfs -ls /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/ Found 21 items -rw-rw-rw-+ 3 a hive 172456 2026-01-02 01:52 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000000_0 -rw-rw-rw-+ 3 a hive 173571 2026-01-02 01:52 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000001_0 -rw-rw-rw-+ 3 a hive 181751 2026-01-02 01:52 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000002_0 -rw-rw-rw-+ 3 a hive 174312 2026-01-02 01:52 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000003_0 [user@my02gn001 ~]$ hdfs dfs -cp /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000/000000_0 /user/hive/warehouse/test_mig_db.db/test_tbl2/ [user@my02gn001 ~]$ hdfs dfs -ls /user/hive/warehouse/test_mig_db.db/test_tbl2/ Found 2 items -rw-rw-rw-+ 3 a hive 172456 2026-01-02 04:26 /user/hive/warehouse/test_mig_db.db/test_tbl2/000000_0 drwxrwxrwx+ - a hive 0 2026-01-02 01:53 /user/hive/warehouse/test_mig_db.db/test_tbl2/delta_0000001_0000001_0000 hive> select * from test_mig_db.test_tbl2 limit 20; |
이렇게 데이터를 옮겨놓으면 데이터가 조회된다.
3. 결론
A클러스터의 Hive Managed Table을 B클러스터의 Hive External Table로 Migration은 가능하지만
기존 Managed Table이 CRUD가능한 Table이라면 불가능하고,
오로지 insert_only 인 경우에만 가능하다.
하지만 이때에도 기존 Managed Table의 delta, base와 같은 디렉터리를 그대로 옮기면 External Table에선 읽을 수 없으며
External Table만들 시 설정한 Location의 위치에 데이터 파일이 존재해야지만 읽을 수 있다.
다음 테스트는 다음과 같다.
기존 Sqoop으로 수집하여 적재되는 테이블이 A클러스터의 Hive Managed Table(Insert-only)였는데
이제 B클러스터의 Hive External Table로 마이그레이션하고나서 Sqoop이 B클러스터의 Hive External Table로 수집을 제대로 하는지 테스트해본다.