본문 바로가기
IT 지식/빅데이터 & 분석

Hive와 HDFS

by 이민우 2024. 5. 2.
728x90
반응형

Hive는 HDFS에 저장된 파일, 디렉토리 구조에 대한 메타 데이터를 가지고 이를 RDB처럼 테이블로 제공하고, SQL을 활용할 수 있는 툴을 제공한다.

 

이 말은 무엇을 의미할까? 한 마디로 Hive의 데이터 중 메타 데이터와 HDFS에 저장된 데이터가 별도라는 이야기이다.

 

메타 데이터는 항상 HIVE가 관리한다. 그렇다면 HDFS에 저장된 데이터는?

 

HDFS에 저장된 데이터의 관리 주체에 따라 HIVE의 테이블은 두 가지로 나뉠 수 있다.

  1. Managed Table : Hive가 HDFS 내의 데이터도 관리한다.
  2. External Table : Hive가 HDFS 내의 데이터까지 관리하지는 않는다.

 

Managed Table

일반 RDB처럼 CREATE TABLE 쿼리를 사용할 경우 생성되는 테이블이다. 메타 데이터는 물론, HDFS의 데이터도 함께 관리한다.

 

HDFS의 데이터를 관리한다는 것이 무엇을 의미할까? 한 번 살펴보자.

 

Hive의 CREATE 쿼리에 LOCATION 옵션을 두면 특정 위치에 데이터를 저장할 수 있다. (만약 지정하지 않으면 hive-site.xml의 hive.metastore.warehouse.dir로 설정한 위치에 저장됨) 한 번 아래 쿼리를 실행해보자.

 

CREATE TABLE IF NOT EXISTS default.TEST_TBL_MNG (
    int_col INT,
    str_col STRING
)
LOCATION 'hdfs:/tmp/test_tbl_mng';

INSERT INTO default.TEST_TBL_MNG 
VALUES
(1, 'A'),
(2, 'B'),
(3, 'C'),
(1, 'D'),
(2, 'E'),
(3, 'F'),
(1, 'G');

 

그리고 위에 LOCATION으로 지정한 /tmp/test_tbl_mng 폴더로 가보면 어떤 파일이 생성되어있고, 해당 파일에 방금 INSERT한 데이터가 존재함을 확인할 수 있다.

 

데이터가 적재되었다면 이제 DROP을 해보자.

DROP TABLE IF EXISTS default.TEST_TBL_MNG

 

그러면 /tmp 내에 test_tbl_mng 폴더가 사라졌음을 확인할 수 있다.

 

이처럼 Managed Table은 HDFS내의 데이터도 HIVE가 관리하기에, HIVE에서 테이블이 DROP되면 메타 데이터 뿐 아니라 HDFS 내 데이터 또한 함께 삭제가 이루어진다.

 

 

External Table

그렇다면 External Table은 뭘까? 위에서 설명했듯이 HDFS의 데이터 관리 주체가 Hive가 아니다.

 

무슨 말이냐하면, DROP 시 HDFS의 데이터가 함께 사라지는 Managed Table과 달리, External Table은 Table을 DROP해도 메타 데이터만 삭제될 뿐, HDFS 내의 데이터까지 삭제하지 않는다는 의미이다.

 

즉 메타 데이터를 삭제해 없는 테이블로 간주하지만, 실제 데이터 자체는 삭제하지 않는다.

 

눈으로 보기 위해 위의 쿼리를 반복해보자. 참고로 External Table 생성을 위해소는 CREATE과 TABLE 사이에 EXTERNAL 키워드를 넣어주면 된다.

 

CREATE EXTERNAL TABLE IF NOT EXISTS default.TEST_TBL_EXT (
    int_col INT,
    str_col STRING
)
LOCATION 'hdfs:/tmp/test_tbl_ext';

INSERT INTO default.TEST_TBL_EXT 
VALUES
(1, 'A'),
(2, 'B'),
(3, 'C'),
(1, 'D'),
(2, 'E'),
(3, 'F'),
(1, 'G');

 

그러면 아까와 마찬가지로 LOCATION에 /tmp/test_tbl_ext라는 폴더가 생성되고, 그 안에 방금 INSERT한 내용이 들어간다.

 

 

그러면 앞서 말한 DROP해도 데이터가 사라지지 않는지를 확인하기 위해 테이블을 DROP해보자.

DROP TABLE IF EXISTS default.TEST_TBL_EXT

 

 

 

 

DROP을 했음에도 불구하고 데이터가 여전히 남아있음을 확인할 수 있다.

 

물론 데이터는 남아있더라도 메타 데이터는 삭제되었으므로, SELECT 쿼리를 날려봤자 존재하지 않는 테이블로 간주되어 데이터는 나오지 않는다.

 

 

 

 

 

HDFS내 데이터를 HIVE Table에서 사용

위 과정을 거쳤다면 생각나는 사실이 있다.

그러면 HDFS에 데이터를 넣어놓고 거기에 LOCATION을 지정해서 테이블을 만들면 별도로 INSERT를 하지 않더라도 데이터 사용이 가능한거네?

 

맞는 말이다. 이를 확인하기 위해 방금 삭제했지만 데이터는 남아있는 /tmp/test_tbl_ext 를 LOCATION으로 두고 테이블을 생성해보자.

 

CREATE TABLE IF NOT EXISTS default.TEST_TABLE_BKUP (
    int_col INT,
    str_col STRING
)
LOCATION 'hdfs:/tmp/test_tbl_ext';

*EXTERNAL, MANAGED를 가리지 않고 어떤 테이블이던 데이터를 불러올 수 있다.

 

그리고 아무런 데이터도 insert를 하지 않고 데이터를 가져와보자.

 

INSERT를 하지 않아도 데이터가 자동으로 복구되어 들어있음을 확인 가능하다.

 

 

 

데이터 복구가 안되는 상황

저번 프로젝트에서 Hive 테이블을 만들고 DROP 후 동명의 테이블을 동일한 Location에 만든 적이 있다. 해당 테이블은 External이었기에 DROP후에도 데이터는 존재했고, Location을 동일하게 지정했으므로 당연히 데이터가 자동으로 복구될 줄 알았다.

 

하지만 데이터는 복구되지 않았고, 이게 무슨 현상인가 하고 유심히 들여다보니 테이블이 파티셔닝 되었기 때문이라는 사실을 깨달았다.

 

파티셔닝이란?

RDBMS에서 너무 많은 데이터가 한 테이블에 들어가있을 경우 성능 이슈가 발생해, 하나의 큰 테이블을 파티션이라는 작은 단위로 나누어 관리하는 방법.

 

무슨 말인지 확인하기 위해 파티셔닝된 테이블을 생성해보자.

CREATE EXTERNAL TABLE IF NOT EXISTS default.TEST_TABLE_PT (
    str_col STRING
)
PARTITIONED BY (int_col INT)
LOCATION 'hdfs:/tmp/test_tbl_pt';

INSERT INTO default.TEST_TABLE_PT 
PARTITION (int_col)
(int_col, str_col)
VALUES
(1, 'A'),
(2, 'B'),
(3, 'C'),
(1, 'D'),
(2, 'E'),
(3, 'F'),
(1, 'G');

 

이제 데이터 저장위치로 지정한 /tmp/test_tbl_pt 디렉터리로 이동하면 파티셔닝으로 지정한 int_col의 값에 따라 데이터가 분할되어 저장됨을 확인할 수 있다.

 

 

그러면 이제 테이블을 DROP하고 그 위치 그대로 테이블을 재생성해보자.

DROP TABLE IF EXISTS default.TEST_TABLE_PT
CREATE EXTERNAL TABLE IF NOT EXISTS default.TEST_TABLE_PT_NEW (
    str_col STRING
)
PARTITIONED BY (int_col INT)
LOCATION 'hdfs:/tmp/test_tbl_pt';

 

이제 TEST_TABLE_PT_NEW에 SELECT 쿼리를 날려보자. 원래대로라면, HDFS에 데이터가 그대로 존재하고 동일한 테이블이 생성되었으니 당연히 SELECT가 되어야만 정상이다.

 

하지만 데이터는 보여지지 않는다.

 

이유는 파티셔닝이 되어있기 때문인데, 파티셔닝된 데이터를 가져와 사용할 경우 이를 복구하는 과정이 필요하다.

 

그 과정은 막 어려운게 아니고, 한 줄의 쿼리면 된다.

MSCK REPAIR TABLE TEST_TABLE_PT_NEW

 

위 쿼리 실행 후 (당연한 말이지만 데이터가 많을수록 소요시간이 길다) 다시 한 번 SELECT 쿼리를 날려보면 성공적으로 HDFS 내 데이터를 불러왔음을 확인할 수 있다.

728x90
반응형