반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

지구정복

[Hive] Hive Managed Table을 타클러스터로 옮기기 | How to migration the Hive Managed table from A Cluster to B Cluster 본문

데이터 엔지니어링 정복/Hive

[Hive] Hive Managed Table을 타클러스터로 옮기기 | How to migration the Hive Managed table from A Cluster to B Cluster

noohhee 2026. 1. 2. 13:50
728x90
반응형

빠른 결론

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로 수집을 제대로 하는지 테스트해본다.

728x90
반응형
Comments