답변:
Hive는 상태를 추적하는 데 사용하는 마스터 노드에 관계형 데이터베이스를 가지고 있습니다. 예를 들어, CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';
이 테이블 스키마는 데이터베이스에 저장됩니다.
파티션 된 테이블이있는 경우 파티션은 데이터베이스에 저장됩니다 (이를 통해 하이브는 파일 시스템으로 이동하여 파티션을 찾지 않고도 파티션 목록을 사용할 수 있습니다). 이런 것들이 '메타 데이터'입니다.
내부 테이블을 삭제하면 데이터가 삭제되고 메타 데이터도 삭제됩니다.
외부 테이블을 삭제하면 메타 데이터 만 삭제됩니다. 즉, 하이브는 이제 해당 데이터를 알지 못합니다. 데이터 자체를 건드리지 않습니다.
Hive 테이블은 EXTERNAL 또는 INTERNAL로 만들 수 있습니다. 이것은 데이터가로드, 제어 및 관리되는 방법에 영향을주는 선택입니다.
다음과 같은 경우 EXTERNAL 테이블을 사용합니다.
다음과 같은 경우 내부 테이블을 사용합니다.
데이터는 일시적입니다.
Hive가 테이블 및 데이터의 수명주기를 완전히 관리하기를 원합니다.
외부 테이블의 경우 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 테이블을 사용합니다.
다음과 같은 경우 내부 테이블을 사용합니다.
출처 :
내부 테이블 데이터는웨어 하우스 폴더에 저장되는 반면 외부 테이블 데이터는 테이블 생성시 언급 한 위치에 저장됩니다.
따라서 내부 테이블을 삭제하면웨어 하우스 폴더 아래의 데이터뿐만 아니라 스키마도 삭제되지만 외부 테이블의 경우 손실되는 스키마 만 삭제됩니다.
따라서 외부 테이블을 삭제 한 후 다시 되돌리려면 동일한 스키마로 테이블을 다시 만들고 원래 데이터 위치를 가리킬 수 있습니다. 이제 분명해지기를 바랍니다.
지금까지 제한된 연구 및 테스트 (Hive 1.1.0 -cdh5.12.0 사용)를 기반으로 한 동작 (의도 된 용도가 아님)의 유일한 차이점은 테이블이 삭제 될 때
(참고 : https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL의 '관리 및 외부 테이블'섹션을 참조하십시오. 여기에는 제가 완전히 이해하지 못한 다른 차이점이 나열 되어 있습니다. )
Hive는 위에서 아래로 다음 우선 순위에 따라 테이블을 생성해야하는 위치를 선택한다고 생각합니다.
"하이브 테이블 생성"중에 "위치"옵션을 사용하지 않으면 위의 우선 순위 규칙이 사용됩니다. 이는 내부 및 외부 테이블 모두에 적용됩니다. 이는 내부 테이블이 반드시웨어 하우스 디렉토리에 상주 할 필요는 없으며 다른 곳에 상주 할 수 있음을 의미합니다.
참고 : 일부 시나리오를 놓쳤을 수 있지만 제한된 탐색을 기반으로 할 때 내부 및 외부 테이블의 동작은 위에서 설명한 한 가지 차이점 (데이터 삭제)을 제외하고는 동일한 것으로 보입니다. 내부 및 외부 테이블 모두에 대해 다음 시나리오를 시도했습니다.
외부 테이블에서 드롭하면 테이블의 스키마 만 삭제되며 테이블 데이터는 물리적 위치에 존재합니다. 따라서 데이터를 삭제하려면 hadoop fs-rmr tablename을 사용하십시오. 관리되는 테이블 하이브는 테이블에 대한 모든 권한을 갖습니다. 외부 테이블에서는 사용자가 제어 할 수 있습니다.
내부 테이블은 Hive가 삭제를 포함하여 데이터의 전체 수명주기를 관리하도록하려는 경우 유용하지만 외부 테이블은 파일이 Hive 외부에서 사용되는 경우 유용합니다.
외부 하이브 테이블은 테이블을 삭제할 때 파일을 제거하지 않는다는 장점이 있으며 serde .... delimited와 같은 다른 설정으로 행 형식을 설정할 수 있습니다.
또한 Hive는 빅 데이터웨어 하우스라는 점을 기억하십시오. 테이블을 삭제하고 싶을 때 기가 바이트 또는 테라 바이트의 데이터를 잃고 싶지 않습니다. 해당 규모의 데이터 생성, 이동 및 복사는 시간이 많이 걸릴 수 있습니다. '관리'테이블 하이브를 삭제하면 데이터도 삭제됩니다. '외부'테이블을 삭제하면 하이브 메타 스토어의 스키마 정의 만 제거됩니다. hdfs의 데이터는 여전히 남아 있습니다.
외부 테이블에 가장 적합한 다음 시나리오를 고려하십시오.
MapReduce (MR) 작업은 대용량 로그 파일을 필터링하여 n
하위 로그 파일 (예 : 각 하위 로그 파일에 특정 메시지 유형 로그 포함) 을 뱉어 내고 출력 즉, n
하위 로그 파일이 hdfs에 저장됩니다.
이러한 로그 파일은 추가 분석을 수행하기 위해 Hive 테이블에로드됩니다.이 시나리오에서는 실제 로그 파일이 외부 프로세스에 의해 생성되고 소유되기 때문에 외부 테이블을 권장합니다. 생성 된 각 로그 파일을 각 Hive 테이블에로드하는 추가 단계도 있습니다.
하이브는 메타 데이터 만 메타 스토어에 저장하고 원본 데이터는 외부 테이블을 사용할 때 하이브 바깥쪽에 저장합니다.
HDFS에 이미 데이터가있는 경우 데이터를 설명하기 위해 외부 Hive 테이블을 만들 수 있습니다. 외부 테이블의 데이터가 기본웨어 하우스 디렉토리 대신 LOCATION 특성에 지정되어 있으므로 EXTERNAL이라고합니다.
내부 테이블에 데이터를 보관할 때 Hive는 테이블과 데이터의 수명주기를 완전히 관리합니다. 이는 내부 테이블이 삭제되면 데이터가 제거됨을 의미합니다. 외부 테이블이 삭제되면 테이블 메타 데이터는 삭제되지만 데이터는 유지됩니다. 대부분의 경우 실수로 테이블과 함께 데이터를 삭제하지 않으려면 외부 테이블을 사용하는 것이 좋습니다.
관리 테이블의 경우 Hive는 데이터의 수명주기를 제어합니다. Hive는 기본적으로 hive.metastore.warehouse.dir에 정의 된 디렉토리 아래의 하위 디렉토리에 관리 테이블의 데이터를 저장합니다.
관리되는 테이블을 삭제하면 Hive가 테이블의 데이터를 삭제하지만 관리되는 테이블은 다른 도구와 공유하기에는 덜 편리합니다. 예를 들어 주로 Pig에서 생성하고 사용하는 데이터가 있지만 이에 대해 일부 쿼리를 실행하고 싶지만 데이터에 대한 Hive 소유권을 부여하지 않으려는 경우를 가정 해 보겠습니다.
이때 해당 데이터를 가리키는 외부 테이블이 정의되지만 소유권을 갖지 않습니다.
Hive에서는 외부 테이블을 만들 수도 있습니다. Hive가웨어 하우스 디렉토리 외부의 기존 위치에있는 데이터를 참조하도록 지시합니다. 외부 테이블을 삭제하면 메타 데이터는 삭제되지만 데이터는 삭제되지 않습니다.