Hive 내부 테이블과 외부 테이블의 차이점은 무엇입니까?


110

누구든지 Hive의 외부 테이블과 내부 테이블의 차이점을 말할 수 있습니까? 테이블을 떨어 뜨릴 때 차이가 있다는 것을 알고 있습니다. 데이터와 메타 데이터가 내부에서 삭제되고 외부 테이블에서 메타 데이터 만 삭제된다는 의미를 이해하지 못합니다. 누구든지 노드 측면에서 나를 설명해 주시겠습니까?

답변:


117

Hive는 상태를 추적하는 데 사용하는 마스터 노드에 관계형 데이터베이스를 가지고 있습니다. 예를 들어, CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';이 테이블 스키마는 데이터베이스에 저장됩니다.

파티션 된 테이블이있는 경우 파티션은 데이터베이스에 저장됩니다 (이를 통해 하이브는 파일 시스템으로 이동하여 파티션을 찾지 않고도 파티션 목록을 사용할 수 있습니다). 이런 것들이 '메타 데이터'입니다.

내부 테이블을 삭제하면 데이터가 삭제되고 메타 데이터도 삭제됩니다.

외부 테이블을 삭제하면 메타 데이터 만 삭제됩니다. 즉, 하이브는 이제 해당 데이터를 알지 못합니다. 데이터 자체를 건드리지 않습니다.


좋아 .. 예를 들어 외부 테이블을 만들었습니다. 무슨 일이야? 데이터가 건드리지 않는다는 것은 무엇을 의미합니까? 해당 테이블의 선택 *을 제공하면 표시됩니까? 나는 그 차이를 상상할 수 없다.
DrewRose

11
테이블을 삭제하면 Hive는 테이블을 삭제하기 전의 상태를 반환합니다. foo를 삭제 한 후 'select * from foo'쿼리를 실행하면 하이브가 테이블이 존재하지 않는다고 알려줍니다. 이것은 당신이 하이브에게 그 테이블을 잊어 버리라고 말했기 때문입니다. 데이터는 이전에 있던 파일 시스템에 여전히 존재합니다. 메타 데이터를 데이터가있는 위치에 대한 '포인터'로 생각하십시오.
prestomation

1
그래서 내가 dis location opt / nancy / foo.txt에 데이터가 있고 외부 테이블에로드하고 드롭하면 메타 데이터가 손실되지만이 위치 opt / nancy / foo.txt의 데이터는 남아 있다고 말하는 것입니까?
DrewRose

좋습니다. 이제이 위치가 HDFS 또는 내 로컬 시스템에 있습니까? 로컬 시스템에있는 경우 데이터를 내부 테이블에로드하고 테이블을 삭제하면 foo.txt 파일이 해당 위치에 계속 남아 있습니다. 내가 지금까지 맞나요?
DrewRose

3
Hive 테이블은 지원되는 파일 시스템 (Hbase, HDFS, S3 등)에 있습니다. "LOAD DATA"를 사용하여 로컬 파일에서 하이브 테이블로 데이터를로드한다고 가정합니다. 이 경우 로컬 파일을 하이브 테이블에 복사합니다. 이 테이블을 삭제하면 내부 테이블의 데이터 사본이 삭제되지만 "LOAD DATA"명령의 소스 파일은 그대로 유지됩니다.
prestomation

100

Hive 테이블은 EXTERNAL 또는 INTERNAL로 만들 수 있습니다. 이것은 데이터가로드, 제어 및 관리되는 방법에 영향을주는 선택입니다.

다음과 같은 경우 EXTERNAL 테이블을 사용합니다.

  1. 데이터는 Hive 외부에서도 사용됩니다. 예를 들어, 데이터 파일은 파일을 잠그지 않는 기존 프로그램에서 읽고 처리합니다.
  2. 데이터는 DROP TABLE 후에도 기본 위치에 남아 있어야합니다. 이는 단일 데이터 세트에서 여러 스키마 (테이블 또는 뷰)를 가리 키거나 가능한 다양한 스키마를 반복하는 경우에 적용될 수 있습니다.
  3. ASV와 같은 사용자 지정 위치를 사용하려고합니다.
  4. Hive는 데이터 및 제어 설정, 디렉토리 등을 소유해서는 안되며 이러한 작업을 수행 할 다른 프로그램이나 프로세스가 있습니다.
  5. 기존 테이블 (AS SELECT)을 기반으로 테이블을 작성하지 않습니다.

다음과 같은 경우 내부 테이블을 사용합니다.

데이터는 일시적입니다.

Hive가 테이블 및 데이터의 수명주기를 완전히 관리하기를 원합니다.



INTERNAL 테이블을 만들면 HDFS에서 데이터가 삭제되거나 원본 (HDFS)을 그대로 유지 한 채로 복사하여 하이브 전용으로 사용합니까?
luckyluke

@swetha 안녕하세요, metastore.db를 완전히 삭제했지만 데이터는 hdfs에 남아 있기 때문에 여기에 왔습니다. 그래서 내가 테이블을 보여줄 때 아무것도 표시되지 않습니다. 메타 데이터를 다시 만드는 방법이 있습니까?
awadhesh14

46

질문에 대답하려면 :

외부 테이블의 경우 Hive는 테이블 생성 중에 지정된 LOCATION에 데이터를 저장합니다 (일반적으로웨어 하우스 디렉토리가 아님). 외부 테이블이 삭제되면 테이블 메타 데이터는 삭제되지만 데이터는 삭제되지 않습니다.

내부 테이블의 경우 Hive는웨어 하우스 디렉터리에 데이터를 저장합니다. 테이블이 삭제되면 테이블 메타 데이터와 데이터가 모두 삭제됩니다.


참고로

내부 테이블과 외부 테이블의 차이점 :

외부 테이블의 경우-

  • 외부 테이블은 HDFS 서버에 파일을 저장하지만 테이블은 소스 파일에 완전히 연결되지 않습니다.

  • 외부 테이블을 삭제해도 파일은 HDFS 서버에 남아 있습니다.

    예를 들어 HIVE-QL을 사용하여 HIVE에서 “table_test” 라는 외부 테이블 을 만들고 테이블을 “file” 파일에 연결하는 경우 , 다음 HDFS에서 "파일"을 삭제하지 않습니다 HIVE에서 "table_test"을 삭제 .

  • 외부 테이블 파일은 HDFS 파일 구조에 대한 액세스 권한이있는 모든 사용자가 액세스 할 수 있으므로 HDFS 파일 / 폴더 수준에서 보안을 관리해야합니다.

  • 메타 데이터는 마스터 노드에 유지되며 HIVE에서 외부 테이블을 삭제하면 데이터 / 파일이 아닌 메타 데이터 만 삭제됩니다.


내부 테이블 용

  • 의 설정에 따라 디렉토리에 저장 hive.metastore.warehouse.dir, 기본 내부 테이블로 저장되어 다음 디렉토리에 "/ 사용자 / 하이브 / 창고" 당신은 설정 파일의 위치를 업데이트하여 변경할 수 있습니다.
  • 테이블을 삭제하면 마스터 노드와 HDFS에서 각각 메타 데이터와 데이터가 삭제됩니다.
  • 내부 테이블 파일 보안은 HIVE를 통해서만 제어됩니다. 보안은 아마도 스키마 수준 (조직에 따라 다름)에서 HIVE 내에서 관리되어야합니다.

Hive에는 내부 또는 외부 테이블이있을 수 있으며 이는 데이터로드, 제어 및 관리 방법에 영향을주는 선택입니다.

다음과 같은 경우 EXTERNAL 테이블을 사용합니다.

  • 데이터는 하이브 사용될 밖에 . 예를 들어, 데이터 파일은 파일을 잠그지 않는 기존 프로그램에서 읽고 처리합니다.
  • 데이터는 DROP TABLE 후에도 기본 위치에 남아 있어야합니다. 이는 단일 데이터 세트에서 여러 스키마 (테이블 또는 뷰)를 가리 키거나 가능한 다양한 스키마를 반복하는 경우에 적용될 수 있습니다.
  • Hive는 데이터를 소유하고 설정, 디렉토리 등을 제어해서는 안됩니다 . 이러한 작업을 수행하는 다른 프로그램이나 프로세스가있을 수 있습니다.
  • 기존 테이블 (AS SELECT)을 기반으로 테이블을 작성하지 않습니다.

다음과 같은 경우 내부 테이블을 사용합니다.

  • 데이터는 임시 .
  • Hive가 테이블 및 데이터의 수명주기를 완전히 관리하기를 원합니다 .

출처 :

HDInsight : Hive 내부 및 외부 테이블 소개

Hadoop- HIVE의 내부 및 외부 테이블


1
@CapturedTree 그러나 대답은 정확하지 않습니다. "Hive는 데이터를웨어 하우스 디렉토리로 이동합니다."-이것은 완전히 잘못된 것입니다. 데이터는 테이블 위치에 저장됩니다. 외부 또는 관리 문제가 아닙니다.
leftjoin

6

내부 테이블 데이터는웨어 하우스 폴더에 저장되는 반면 외부 테이블 데이터는 테이블 생성시 언급 한 위치에 저장됩니다.

따라서 내부 테이블을 삭제하면웨어 하우스 폴더 아래의 데이터뿐만 아니라 스키마도 삭제되지만 외부 테이블의 경우 손실되는 스키마 만 삭제됩니다.

따라서 외부 테이블을 삭제 한 후 다시 되돌리려면 동일한 스키마로 테이블을 다시 만들고 원래 데이터 위치를 가리킬 수 있습니다. 이제 분명해지기를 바랍니다.


4

지금까지 제한된 연구 및 테스트 (Hive 1.1.0 -cdh5.12.0 사용)를 기반으로 한 동작 (의도 된 용도가 아님)의 유일한 차이점은 테이블이 삭제 될 때

  • 내부 (관리) 테이블의 데이터가 HDFS 파일 시스템에서 삭제됩니다.
  • 외부 테이블의 데이터는 HDFS 파일 시스템에서 삭제되지 않습니다.

(참고 : https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL의 '관리 및 외부 테이블'섹션을 참조하십시오. 여기에는 제가 완전히 이해하지 못한 다른 차이점이 나열 되어 있습니다. )

Hive는 위에서 아래로 다음 우선 순위에 따라 테이블을 생성해야하는 위치를 선택한다고 생각합니다.

  1. 테이블 생성 중에 정의 된 위치
  2. 테이블이 생성되는 데이터베이스 / 스키마 생성에 정의 된 위치입니다.
  3. 기본 Hive웨어 하우스 디렉토리 (hive.site.xml의 hive.metastore.warehouse.dir 등록 정보)

"하이브 테이블 생성"중에 "위치"옵션을 사용하지 않으면 위의 우선 순위 규칙이 사용됩니다. 이는 내부 및 외부 테이블 모두에 적용됩니다. 이는 내부 테이블이 반드시웨어 하우스 디렉토리에 상주 할 필요는 없으며 다른 곳에 상주 할 수 있음을 의미합니다.

참고 : 일부 시나리오를 놓쳤을 수 있지만 제한된 탐색을 기반으로 할 때 내부 및 외부 테이블의 동작은 위에서 설명한 한 가지 차이점 (데이터 삭제)을 제외하고는 동일한 것으로 보입니다. 내부 및 외부 테이블 모두에 대해 다음 시나리오를 시도했습니다.

  1. 위치 옵션이 있거나없는 테이블 만들기
  2. 파티션 옵션이 있거나없는 테이블 생성
  3. Hive Load 및 Insert 문을 사용하여 새 데이터 추가
  4. Hive 외부의 테이블 위치에 데이터 파일 추가 (HDFS 명령 사용) 및 "MSCK REPAIR TABLE 명령을 사용하여 테이블 새로 고침
  5. 테이블 삭제

좋은 탐험. 이것은 하이브가 내부 및 외부 테이블에 대한 위치 옵션을 처리하는 방법을 설명한 유일한 대답입니다.
d2207197 2018

3

외부 테이블에서 드롭하면 테이블의 스키마 만 삭제되며 테이블 데이터는 물리적 위치에 존재합니다. 따라서 데이터를 삭제하려면 hadoop fs-rmr tablename을 사용하십시오. 관리되는 테이블 하이브는 테이블에 대한 모든 권한을 갖습니다. 외부 테이블에서는 사용자가 제어 할 수 있습니다.


CREATE TABLE foo (id INT)를 통해 생성 된 내부 테이블에서 DROP TABLE 후에 디렉터리가 항상 삭제되지 않는 상황이 발생했습니다. SHOW TABLES가 일관성이 있기 때문에 메타 데이터는 분명히 괜찮습니다. 테이블이 삭제 된 후에는 해당 목록에 나타나지 않습니다. 혼란스럽게도 / is / 디렉토리가 가끔 삭제되는 것을 발견했지만 일관되게 다시 만들 수는 없습니다. 어떤 아이디어?
Matthew Cornell

테이블의 권한이 확인 되었습니까? HDFS의 위치 소유권을 다른 사용자로 변경했을 수 있습니다.
Milind Jindal 2014

1

내부 테이블은 Hive가 삭제를 포함하여 데이터의 전체 수명주기를 관리하도록하려는 경우 유용하지만 외부 테이블은 파일이 Hive 외부에서 사용되는 경우 유용합니다.


1

외부 하이브 테이블은 테이블을 삭제할 때 파일을 제거하지 않는다는 장점이 있으며 serde .... delimited와 같은 다른 설정으로 행 형식을 설정할 수 있습니다.


1

또한 Hive는 빅 데이터웨어 하우스라는 점을 기억하십시오. 테이블을 삭제하고 싶을 때 기가 바이트 또는 테라 바이트의 데이터를 잃고 싶지 않습니다. 해당 규모의 데이터 생성, 이동 및 복사는 시간이 많이 걸릴 수 있습니다. '관리'테이블 하이브를 삭제하면 데이터도 삭제됩니다. '외부'테이블을 삭제하면 하이브 메타 스토어의 스키마 정의 만 제거됩니다. hdfs의 데이터는 여전히 남아 있습니다.


1

외부 테이블에 가장 적합한 다음 시나리오를 고려하십시오.

MapReduce (MR) 작업은 대용량 로그 파일을 필터링하여 n하위 로그 파일 (예 : 각 하위 로그 파일에 특정 메시지 유형 로그 포함) 을 뱉어 내고 출력 즉, n하위 로그 파일이 hdfs에 저장됩니다.

이러한 로그 파일은 추가 분석을 수행하기 위해 Hive 테이블에로드됩니다.이 시나리오에서는 실제 로그 파일이 외부 프로세스에 의해 생성되고 소유되기 때문에 외부 테이블을 권장합니다. 생성 된 각 로그 파일을 각 Hive 테이블에로드하는 추가 단계도 있습니다.


1

하이브의 외부 테이블에 대한 최상의 사용 사례는 CSV 또는 텍스트 파일에서 테이블을 만들려는 경우입니다.


0

하이브는 메타 데이터 만 메타 스토어에 저장하고 원본 데이터는 외부 테이블을 사용할 때 하이브 바깥쪽에 저장합니다.


0

HDFS에 이미 데이터가있는 경우 데이터를 설명하기 위해 외부 Hive 테이블을 만들 수 있습니다. 외부 테이블의 데이터가 기본웨어 하우스 디렉토리 대신 LOCATION 특성에 지정되어 있으므로 EXTERNAL이라고합니다.

내부 테이블에 데이터를 보관할 때 Hive는 테이블과 데이터의 수명주기를 완전히 관리합니다. 이는 내부 테이블이 삭제되면 데이터가 제거됨을 의미합니다. 외부 테이블이 삭제되면 테이블 메타 데이터는 삭제되지만 데이터는 유지됩니다. 대부분의 경우 실수로 테이블과 함께 데이터를 삭제하지 않으려면 외부 테이블을 사용하는 것이 좋습니다.


0

관리 테이블의 경우 Hive는 데이터의 수명주기를 제어합니다. Hive는 기본적으로 hive.metastore.warehouse.dir에 정의 된 디렉토리 아래의 하위 디렉토리에 관리 테이블의 데이터를 저장합니다.

관리되는 테이블을 삭제하면 Hive가 테이블의 데이터를 삭제하지만 관리되는 테이블은 다른 도구와 공유하기에는 덜 편리합니다. 예를 들어 주로 Pig에서 생성하고 사용하는 데이터가 있지만 이에 대해 일부 쿼리를 실행하고 싶지만 데이터에 대한 Hive 소유권을 부여하지 않으려는 경우를 가정 해 보겠습니다.

이때 해당 데이터를 가리키는 외부 테이블이 정의되지만 소유권을 갖지 않습니다.


0

내부 : 테이블 생성 우선데이터 로드 나중에

EXTERNAL : 데이터테이블 된다 위에 만들어진 그것.


0

Hive에서는 외부 테이블을 만들 수도 있습니다. Hive가웨어 하우스 디렉토리 외부의 기존 위치에있는 데이터를 참조하도록 지시합니다. 외부 테이블을 삭제하면 메타 데이터는 삭제되지만 데이터는 삭제되지 않습니다.


0

나는 그것을 추가하고 싶습니다

  1. 내부 테이블은 내부 테이블에서 ACID 속성을 지원할 수 있지만 외부 테이블에서는 ACID 속성을 지원할 수 없기 때문에 데이터를 업데이트하거나 일부 행을 삭제해야하는 경우에 사용됩니다.
  2. 내부 테이블이 삭제되면 데이터도 손실되므로 내부 테이블에 데이터 백업이 있는지 확인하십시오.

-2

간단히 말해서 두 가지가 있습니다.

Hive는웨어 하우스의 항목을 관리 할 수 ​​있습니다. 즉웨어 하우스에서 데이터를 삭제하지 않습니다. 테이블을 삭제할 때 :

1) 내부 테이블의 경우 데이터는웨어 하우스에서 내부적으로 관리됩니다. 그래서 삭제됩니다.

2) 외부 테이블의 경우 데이터는 창고에서 영구적으로 관리됩니다. 따라서 삭제할 수 없으며 하이브 이외의 클라이언트도 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.