Differenza tra tabelle interne Hive e tabelle esterne?


110

Qualcuno può dirmi la differenza tra la tabella esterna di Hive e le tabelle interne. So che la differenza arriva quando si lascia cadere il tavolo. Non capisco cosa intendi per dati e metadati vengono eliminati nelle tabelle interne e solo i metadati vengono eliminati nelle tabelle esterne. Qualcuno può spiegarmi in termini di nodi per favore.

Risposte:


118

Hive dispone di un database relazionale sul nodo master che utilizza per tenere traccia dello stato. Ad esempio, quando si CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';, questo schema di tabella viene archiviato nel database.

Se si dispone di una tabella partizionata, le partizioni vengono archiviate nel database (ciò consente a hive di utilizzare elenchi di partizioni senza accedere al file system e trovarle, ecc.). Questo genere di cose sono i "metadati".

Quando si rilascia una tabella interna, vengono eliminati i dati e vengono eliminati anche i metadati.

Quando si rilascia una tabella esterna, vengono eliminati solo i metadati. Ciò significa che l'alveare ignora quei dati ora. Non tocca i dati stessi.


ok .. per esempio ho creato una tabella esterna .. e l'ho rilasciata. che succede? cosa intendi con i dati non vengono toccati? se fornisco una selezione * di quella tabella verrà visualizzato? non sono in grado di immaginare la differenza.
DrewRose

11
Se elimini una tabella, Hive restituisce lo stato in cui si trovava prima di rilasciare la tabella. se esegui la query 'select * from foo' dopo aver rilasciato foo, hive ti dirà che la tabella non esiste. Questo perché hai detto ad hive di dimenticare quel tavolo. I dati esistono ancora in qualunque filesystem si trovassero prima. Pensa ai metadati come a un "puntatore" alla posizione dei dati.
prestomation

1
Quindi stai dicendo che se ho dati in dis location opt / nancy / foo.txt e li carico nella tabella esterna e li rilasciamo, i metadati vengono persi ma i dati in questa posizione opt / nancy / foo.txt rimangono?
DrewRose

OK, ora questa posizione è nell'HDFS o nel mio sistema locale? Se è nel sistema locale, quando carico i dati in una tabella interna e rilascio la tabella, il file foo.txt rimarrà comunque in quella posizione. ho ragione finora?
DrewRose

3
Le tabelle Hive si trovano su un file system supportato (Hbase, HDFS, S3, ecc.). Suppongo che tu stia usando "LOAD DATA" per caricare i dati da un file locale in una tabella hive? In questo caso, stai copiando il file locale in una tabella hive. Quando si rilascia questa tabella, la copia dei dati nella tabella interna verrà eliminata, ma il file di origine dal comando "LOAD DATA" sarà ancora intatto.
prestomation

101

Le tabelle hive possono essere create come ESTERNE o INTERNE. Questa è una scelta che influisce sul modo in cui i dati vengono caricati, controllati e gestiti.

Utilizza tabelle ESTERNE quando:

  1. I dati vengono utilizzati anche al di fuori di Hive. Ad esempio, i file di dati vengono letti ed elaborati da un programma esistente che non blocca i file.
  2. I dati devono rimanere nella posizione sottostante anche dopo un DROP TABLE. Questo può essere applicato se stai puntando più schemi (tabelle o viste) in un singolo set di dati o se stai iterando attraverso vari schemi possibili.
  3. Desideri utilizzare una posizione personalizzata come ASV.
  4. Hive non dovrebbe possedere dati e impostazioni di controllo, directory, ecc., Hai un altro programma o processo che farà queste cose.
  5. Non stai creando una tabella basata su una tabella esistente (AS SELECT).

Utilizza tabelle INTERNE quando:

I dati sono temporanei.

Desideri che Hive gestisca completamente il ciclo di vita della tabella e dei dati.



la creazione di una tabella INTERNA eliminerà i dati da HDFS o ne farà una copia e la utilizzerà esclusivamente per hive lasciando intatta la sorgente (HDFS)?
luckyluke

@swetha Ciao, sono venuto qui perché ho cancellato completamente metastore.db ma i dati rimangono su hdfs. Quindi quando mostro le tabelle non viene mostrato nulla. C'è un modo per ricreare i metadati?
awadhesh14

47

Per rispondere alla tua domanda:

Per le tabelle esterne, Hive archivia i dati nella POSIZIONE specificata durante la creazione della tabella (generalmente non nella directory warehouse). Se la tabella esterna viene eliminata, i metadati della tabella vengono eliminati ma non i dati.

Per le tabelle interne, Hive archivia i dati nella propria directory warehouse. Se la tabella viene eliminata, verranno eliminati sia i metadati della tabella che i dati.


Per tua referenza,

Differenza tra tabelle interne ed esterne:

Per Tavoli Esterni -

  • La tabella esterna memorizza i file sul server HDFS ma le tabelle non sono collegate completamente al file di origine.

  • Se elimini una tabella esterna, il file rimane ancora sul server HDFS.

    Ad esempio, se crei una tabella esterna chiamata "table_test" in HIVE utilizzando HIVE-QL e colleghi la tabella al file "file" , l' eliminazione di "table_test" da HIVE non eliminerà "file" da HDFS .

  • I file delle tabelle esterne sono accessibili a chiunque abbia accesso alla struttura dei file HDFS e quindi la sicurezza deve essere gestita a livello di file / cartella HDFS.

  • I metadati vengono mantenuti sul nodo master e l'eliminazione di una tabella esterna da HIVE elimina solo i metadati, non i dati / file.


Per Tavoli Interni

  • Memorizzate in una directory in base alle impostazioni in hive.metastore.warehouse.dir, per impostazione predefinita le tabelle interne sono archiviate nella seguente directory “/ user / hive / warehouse” è possibile modificarla aggiornando la posizione nel file di configurazione.
  • L'eliminazione della tabella elimina i metadati e i dati rispettivamente dal nodo master e dall'HDFS.
  • La sicurezza del file della tabella interna viene controllata esclusivamente tramite HIVE. La sicurezza deve essere gestita all'interno di HIVE, probabilmente a livello di schema (dipende dall'organizzazione).

Hive può avere tabelle interne o esterne, questa è una scelta che influisce sul modo in cui i dati vengono caricati, controllati e gestiti.

Utilizza tabelle ESTERNE quando:

  • I dati vengono utilizzati anche al di fuori di Hive . Ad esempio, i file di dati vengono letti ed elaborati da un programma esistente che non blocca i file.
  • I dati devono rimanere nella posizione sottostante anche dopo un DROP TABLE. Questo può essere applicato se stai puntando più schemi (tabelle o viste) in un singolo set di dati o se stai iterando attraverso vari schemi possibili.
  • Hive non dovrebbe possedere dati e impostazioni di controllo, directory, ecc ., Potresti avere un altro programma o processo che farà queste cose.
  • Non stai creando una tabella basata su una tabella esistente (AS SELECT).

Utilizza tabelle INTERNE quando:

  • I dati sono temporanei .
  • Desideri che Hive gestisca completamente il ciclo di vita della tabella e dei dati .

Fonte :

HDInsight: Introduzione alle tabelle interne ed esterne di Hive

Tavoli interni ed esterni in Hadoop- HIVE


1
@CapturedTree Ma la risposta non è corretta. "Hive sposta i dati nella sua directory warehouse." -Questo è completamente sbagliato, non lo fa. I dati vengono archiviati nella posizione della tabella. Non importa esterno o gestito.
sinistra unisciti al

6

I dati di una tabella interna vengono archiviati nella cartella warehouse, mentre i dati di una tabella esterna vengono archiviati nella posizione menzionata nella creazione della tabella.

Quindi, quando elimini una tabella interna, elimina lo schema così come i dati nella cartella warehouse, ma per una tabella esterna è solo lo schema che perderai.

Quindi, quando desideri che una tabella esterna ti riaccompagni dopo averla eliminata, puoi creare di nuovo una tabella con lo stesso schema e puntarla alla posizione dei dati originale. Spero sia chiaro ora.


4

L'unica differenza di comportamento (non l'uso previsto) in base alla mia ricerca e test limitati finora (utilizzando Hive 1.1.0 -cdh5.12.0) sembra essere che quando una tabella viene eliminata

  • i dati delle tabelle interne (gestite) vengono eliminati dal file system HDFS
  • mentre i dati delle tabelle esterne NON vengono eliminati dal file system HDFS.

(NOTA: vedere la sezione "Tabelle gestite ed esterne" in https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL che elenca alcune altre differenze che non ho compreso completamente)

Credo che Hive scelga la posizione in cui deve creare la tabella in base alla seguente precedenza dall'alto verso il basso

  1. Posizione definita durante la creazione della tabella
  2. Posizione definita nella creazione del database / schema in cui viene creata la tabella.
  3. Directory di magazzino Hive predefinita (proprietà hive.metastore.warehouse.dir in hive.site.xml)

Quando l'opzione "Posizione" non viene utilizzata durante la "creazione di una tabella hive", viene utilizzata la regola di precedenza precedente. Questo è applicabile sia alle tabelle interne che a quelle esterne. Ciò significa che una tabella interna non deve necessariamente risiedere nella directory Warehouse e può risiedere altrove.

Nota: potrei aver perso alcuni scenari, ma in base alla mia esplorazione limitata, il comportamento della tabella interna ed Extenal sembra essere lo stesso tranne che per l'unica differenza (cancellazione dei dati) descritta sopra. Ho provato i seguenti scenari sia per le tabelle interne che per quelle esterne.

  1. Creazione di una tabella con e senza l'opzione Posizione
  2. Creazione di una tabella con e senza opzione di partizione
  3. Aggiunta di nuovi dati utilizzando Hive Load e Inserisci istruzioni
  4. Aggiunta di file di dati alla posizione della tabella all'esterno di Hive (utilizzando i comandi HDFS) e aggiornamento della tabella utilizzando il comando "MSCK REPAIR TABLE
  5. Far cadere i tavoli

bella esplorazione. Questa è l'unica risposta spiegata sul modo in cui hive gestisce l'opzione di posizione per la tabella interna ed esterna.
d2207197

3

Nelle tabelle esterne, se lo rilasci, elimina solo lo schema della tabella, i dati della tabella esistono nella posizione fisica. Quindi per cancellare i dati usa hadoop fs - rmr tablename. L'hive delle tabelle gestite avrà il controllo completo sulle tabelle. Nelle tabelle esterne gli utenti avranno il controllo su di esso.


Sto riscontrando una situazione in cui la directory non viene sempre eliminata dopo una DROP TABLE su una tabella interna creata tramite CREATE TABLE foo (id INT). Apparentemente i metadati sono ok perché SHOW TABLES è coerente: la tabella non viene visualizzata nell'elenco dopo essere stata rilasciata. In modo confuso, a volte ho notato che la directory / è / cancellata, ma non riesco a ricrearla in modo coerente. Qualche idea?
Matthew Cornell

Le autorizzazioni delle tabelle sono controllate? Potresti aver cambiato la proprietà della posizione su HDFS a un utente diverso.
Milind Jindal

1

Le tabelle interne sono utili se si desidera che Hive gestisca l'intero ciclo di vita dei dati, inclusa l'eliminazione, mentre le tabelle esterne sono utili quando i file vengono utilizzati al di fuori di Hive.


1

La tabella hive esterna presenta i vantaggi che non rimuove i file quando rilasciamo tabelle, possiamo impostare formati di riga con impostazioni diverse, come serde .... delimited


1

Inoltre, tieni presente che Hive è un grande data warehouse. Quando si desidera eliminare una tabella, non si desidera perdere gigabyte o terabyte di dati. La generazione, lo spostamento e la copia dei dati su tale scala può richiedere molto tempo. Quando si rilascia un hive di tabella "gestito", verranno eliminati anche i suoi dati. Quando si rilascia una tabella "esterna", viene rimossa solo la definizione dello schema dal meta-archivio hive. I dati sugli hdf rimangono ancora.


1

Considera questo scenario che si adatta meglio alla tabella esterna:

Un lavoro MapReduce (MR) filtra un enorme file di registro per espellere i nfile di registro secondari (ad esempio, ogni file di registro secondario contiene un registro del tipo di messaggio specifico) e l'output, ovvero i nfile di registro secondari sono memorizzati in hdfs.

Questi file di log devono essere caricati nelle tabelle Hive per eseguire ulteriori analisi, in questo scenario consiglierei una / e tabella / e esterna / e, perché i file di log effettivi sono generati e posseduti da un processo esterno, cioè un lavoro di RM, inoltre puoi evitare un passaggio aggiuntivo del caricamento di ogni file di registro generato nella rispettiva tabella Hive.


1

Il miglior caso d'uso per una tabella esterna nell'hive è quando si desidera creare la tabella da un file CSV o testo


0

hive memorizza solo i metadati nel metastore e i dati originali all'esterno dell'alveare quando usiamo una tabella esterna possiamo dare la posizione '' con questi i nostri dati originali non avranno effetto quando rilasciamo la tabella


0

Quando sono già presenti dati in HDFS, è possibile creare una tabella Hive esterna per descrivere i dati. Si chiama EXTERNAL perché i dati nella tabella esterna sono specificati nelle proprietà LOCATION invece che nella directory warehouse predefinita.

Quando si conservano i dati nelle tabelle interne, Hive gestisce completamente il ciclo di vita della tabella e dei dati. Ciò significa che i dati vengono rimossi una volta eliminata la tabella interna. Se la tabella esterna viene eliminata, i metadati della tabella vengono eliminati ma i dati vengono conservati. La maggior parte delle volte è preferibile una tabella esterna per evitare di eliminare per errore i dati insieme alle tabelle.


0

Per le tabelle gestite, Hive controlla il ciclo di vita dei dati. Hive archivia i dati per le tabelle gestite in una sottodirectory nella directory definita da hive.metastore.warehouse.dir per impostazione predefinita.

Quando rilasciamo una tabella gestita, Hive elimina i dati nella tabella, ma le tabelle gestite sono meno convenienti per la condivisione con altri strumenti. Ad esempio, supponiamo di avere dati che vengono creati e utilizzati principalmente da Pig, ma vogliamo eseguire alcune query su di essi, ma non dare a Hive la proprietà dei dati.

A quel punto, viene definita una tabella esterna che punta a quei dati, ma non ne assume la proprietà.


0

INTERNO : la tabella viene creata prima e i dati vengono caricati successivamente

ESTERNO : i dati sono presenti e la tabella viene creata sopra di essi.


0

In Hive possiamo anche creare una tabella esterna. Indica a Hive di fare riferimento ai dati che si trovano in una posizione esistente al di fuori della directory warehouse. L'eliminazione delle tabelle esterne eliminerà i metadati ma non i dati.


0

Vorrei aggiungere quello

  1. Le tabelle interne vengono utilizzate quando i dati devono essere aggiornati o alcune righe devono essere eliminate perché le proprietà ACID possono essere supportate sulle tabelle interne ma le proprietà ACID non possono essere supportate sulle tabelle esterne.
  2. Assicurati che ci sia un backup dei dati nella tabella interna perché se una tabella interna viene eliminata, anche i dati andranno persi.

-2

In parole semplici, ci sono due cose:

Hive è in grado di gestire le cose nel magazzino, ovvero non eliminerà i dati dal magazzino. Quando cancelliamo la tabella:

1) Per le tabelle interne i dati sono gestiti internamente a magazzino. Quindi verrà eliminato.

2) Per le tabelle esterne i dati sono gestiti eterni da magazzino. Quindi non può essere eliminato e anche i client diversi da hive possono utilizzarlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.