Différence entre les tables internes Hive et les tables externes?

110

Quelqu'un peut-il me dire la différence entre la table externe de Hive et les tables internes. Je sais que la différence vient du fait de laisser tomber la table. Je ne comprends pas ce que vous entendez par les données et les métadonnées sont supprimées en interne et seules les métadonnées sont supprimées dans les tables externes. Quelqu'un peut-il m'expliquer en termes de nœuds s'il vous plaît.

DrewRose
la source

Réponses:

118

Hive dispose d'une base de données relationnelle sur le nœud maître qu'il utilise pour suivre l'état. Par exemple, quand vousCREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/'; , ce schéma de table est stocké dans la base de données.

Si vous avez une table partitionnée, les partitions sont stockées dans la base de données (cela permet à Hive d'utiliser des listes de partitions sans aller dans le système de fichiers et les trouver, etc.). Ce genre de choses sont les «métadonnées».

Lorsque vous supprimez une table interne, les données sont supprimées et les métadonnées sont également supprimées.

Lorsque vous supprimez une table externe, il ne supprime que les métadonnées. Cela signifie que la ruche ignore maintenant ces données. Il ne touche pas aux données elles-mêmes.

prestomation
la source
ok .. par exemple j'ai créé une table externe .. et je la laisse tomber. ce qui se produit? qu'entendez-vous par les données ne sont pas touchées? si je donne un select * de ce tableau, sera-t-il affiché? je ne peux pas imaginer la différence.
DrewRose
11
Si vous supprimez une table, Hive renvoie l'état dans lequel elle se trouvait avant la suppression de la table. si vous exécutez la requête 'select * from foo' après avoir déposé foo, hive vous dira que la table n'existe pas. C'est parce que vous avez dit à Hive d'oublier cette table. Les données existent toujours dans le système de fichiers dans lequel elles se trouvaient auparavant. Considérez les métadonnées comme un «pointeur» vers l'emplacement des données.
prestomation le
1
Donc, vous dites que si j'ai des données dans l'emplacement opt ​​/ nancy / foo.txt et que je les charge dans la table externe et que je les laisse tomber, les métadonnées sont perdues mais les données à cet emplacement opt ​​/ nancy / foo.txt restent?
DrewRose
OK, cet emplacement est-il maintenant dans le HDFS ou sur mon système local? Si c'est dans le système local, lorsque je charge les données dans une table interne et que je supprime la table, le fichier foo.txt restera toujours à cet emplacement. ai-je raison si loin?
DrewRose
3
Les tables Hive se trouvent sur un système de fichiers pris en charge (Hbase, HDFS, S3, etc.). Je suppose que vous utilisez "LOAD DATA" pour charger des données d'un fichier local dans une table de ruche? Dans ce cas, vous copiez le fichier local dans une table Hive. Lorsque vous supprimez cette table, la copie des données de la table interne sera supprimée, mais le fichier source de la commande "LOAD DATA" sera toujours intact.
prestomation
102

Les tables Hive peuvent être créées comme EXTERNAL ou INTERNAL. Il s'agit d'un choix qui affecte la manière dont les données sont chargées, contrôlées et gérées.

Utilisez des tables EXTERNES lorsque:

  1. Les données sont également utilisées en dehors de Hive. Par exemple, les fichiers de données sont lus et traités par un programme existant qui ne verrouille pas les fichiers.
  2. Les données doivent rester à l'emplacement sous-jacent même après un DROP TABLE. Cela peut s'appliquer si vous pointez plusieurs schémas (tables ou vues) sur un seul ensemble de données ou si vous effectuez une itération à travers différents schémas possibles.
  3. Vous souhaitez utiliser un emplacement personnalisé tel que ASV.
  4. Hive ne doit pas posséder de données ni de paramètres de contrôle, de répertoires, etc., vous avez un autre programme ou processus qui fera ces choses.
  5. Vous ne créez pas de table basée sur une table existante (AS SELECT).

Utilisez les tables INTERNAL lorsque:

Les données sont temporaires.

Vous voulez que Hive gère complètement le cycle de vie de la table et des données.

swetha
la source
la création d'une table INTERNE supprimera-t-elle les données de HDFS ou fera-t-elle une copie et l'utilisera exclusivement pour la ruche en laissant la source (HDFS) intacte?
luckyluke
@swetha Salut, je suis venu ici parce que j'ai complètement supprimé le metastore.db mais les données restent sur hdfs. Donc, quand je montre des tableaux, rien n'est montré. Existe-t-il un moyen de recréer les métadonnées?
awadhesh14
47

Pour répondre à votre question:

Pour les tables externes, Hive stocke les données à l'emplacement spécifié lors de la création de la table (généralement pas dans le répertoire de l'entrepôt). Si la table externe est supprimée, les métadonnées de la table sont supprimées mais pas les données.

Pour les tables internes, Hive stocke les données dans son répertoire d'entrepôt. Si la table est supprimée, les métadonnées de la table et les données seront supprimées.


Pour votre information,

Différence entre les tables internes et externes:

Pour les tables externes -

  • La table externe stocke les fichiers sur le serveur HDFS mais les tables ne sont pas complètement liées au fichier source.

  • Si vous supprimez une table externe, le fichier reste toujours sur le serveur HDFS.

    Par exemple, si vous créez une table externe appelée «table_test» dans HIVE en utilisant HIVE-QL et que vous liez la table au fichier «file» , alors la suppression de «table_test» de HIVE ne supprimera pas le «file» de HDFS .

  • Les fichiers de table externes sont accessibles à toute personne ayant accès à la structure de fichiers HDFS et, par conséquent, la sécurité doit être gérée au niveau du fichier / dossier HDFS.

  • Les métadonnées sont conservées sur le nœud maître et la suppression d'une table externe de HIVE supprime uniquement les métadonnées et non les données / le fichier.


Pour les tables internes-

  • Stockées dans un répertoire basé sur les paramètres de hive.metastore.warehouse.dir, par défaut, les tables internes sont stockées dans le répertoire suivant «/ user / hive / warehouse» vous pouvez le modifier en mettant à jour l'emplacement dans le fichier de configuration.
  • La suppression de la table supprime respectivement les métadonnées et les données du nœud maître et de HDFS.
  • La sécurité des fichiers de table internes est contrôlée uniquement via HIVE. La sécurité doit être gérée au sein de HIVE, probablement au niveau du schéma (dépend de l'organisation).

Hive peut avoir des tables internes ou externes, c'est un choix qui affecte la façon dont les données sont chargées, contrôlées et gérées.

Utilisez des tables EXTERNES lorsque:

  • Les données sont également utilisées en dehors de Hive . Par exemple, les fichiers de données sont lus et traités par un programme existant qui ne verrouille pas les fichiers.
  • Les données doivent rester à l'emplacement sous-jacent même après un DROP TABLE. Cela peut s'appliquer si vous pointez plusieurs schémas (tables ou vues) sur un seul ensemble de données ou si vous effectuez une itération à travers différents schémas possibles.
  • Hive ne doit pas posséder de données ni de paramètres de contrôle, de répertoires, etc. , vous pouvez avoir un autre programme ou processus qui fera ces choses.
  • Vous ne créez pas de table basée sur une table existante (AS SELECT).

Utilisez les tables INTERNAL lorsque:

  • Les données sont temporaires .
  • Vous voulez que Hive gère complètement le cycle de vie de la table et des données .

La source :

HDInsight: Introduction aux tables internes et externes Hive

Tables internes et externes dans Hadoop- HIVE

Ani Menon
la source
1
@CapturedTree Mais la réponse n'est pas correcte. "Hive déplace les données dans son répertoire d'entrepôt." -C'est complètement faux, ce n'est pas le cas. Les données sont stockées à l'emplacement de la table. Peu importe externe ou géré.
leftjoin
6

Une donnée de table interne est stockée dans le dossier de l'entrepôt, tandis qu'une donnée de table externe est stockée à l'emplacement que vous avez mentionné lors de la création de la table.

Ainsi, lorsque vous supprimez une table interne, cela supprime le schéma ainsi que les données sous le dossier de l'entrepôt, mais pour une table externe, c'est uniquement le schéma que vous perdrez.

Ainsi, lorsque vous souhaitez récupérer une table externe après l'avoir supprimée, vous pouvez à nouveau créer une table avec le même schéma et la pointer vers l'emplacement des données d'origine. J'espère que c'est clair maintenant.

Apprenant Hadoop
la source
4

La seule différence de comportement (pas l'utilisation prévue) basée sur mes recherches et mes tests limités jusqu'à présent (en utilisant Hive 1.1.0 -cdh5.12.0) semble être que lorsqu'une table est supprimée

  • les données des tables internes (gérées) sont supprimées du système de fichiers HDFS
  • tandis que les données des tables externes ne sont PAS supprimées du système de fichiers HDFS.

(REMARQUE: voir la section 'Tables gérées et externes' dans https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL qui liste une autre différence que je n'ai pas complètement comprise)

Je pense que Hive choisit l'emplacement où il doit créer la table en fonction de la priorité suivante de haut en bas

  1. Emplacement défini lors de la création de la table
  2. Emplacement défini dans la création de base de données / schéma dans lequel la table est créée.
  3. Répertoire d'entrepôt Hive par défaut (propriété hive.metastore.warehouse.dir dans hive.site.xml)

Lorsque l'option "Emplacement" n'est pas utilisée lors de la "création d'une table ruche", la règle de priorité ci-dessus est utilisée. Cela s'applique aux tables internes et externes. Cela signifie qu'une table interne ne doit pas nécessairement résider dans le répertoire Warehouse et peut résider n'importe où ailleurs.

Remarque: j'ai peut-être manqué certains scénarios, mais sur la base de mon exploration limitée, le comportement des tables interne et externe semble être le même, à l'exception de la seule différence (suppression des données) décrite ci-dessus. J'ai essayé les scénarios suivants pour les tables internes et externes.

  1. Créer une table avec et sans option Emplacement
  2. Créer une table avec et sans option de partition
  3. Ajout de nouvelles données à l'aide des instructions Hive Load et Insert
  4. Ajout de fichiers de données à l'emplacement de la table en dehors de Hive (à l'aide des commandes HDFS) et actualisation de la table à l'aide de la commande «MSCK REPAIR TABLE»
  5. Abandonner les tables
NallaAnand
la source
belle exploration. C'est la seule réponse expliquée comment la ruche gère l'option d'emplacement pour les tables internes et externes.
d2207197
3

Dans les tables externes, si vous le supprimez, il supprime uniquement le schéma de la table, les données de la table existent dans l'emplacement physique. Donc, pour supprimer les données, utilisez hadoop fs - rmr tablename. La ruche de table gérée aura un contrôle total sur les tables. Dans les tables externes, les utilisateurs auront le contrôle dessus.

Ajaykumar
la source
Je rencontre une situation où le répertoire n'est pas toujours supprimé après un DROP TABLE sur une table interne créée via CREATE TABLE foo (id INT). Les métadonnées sont apparemment correctes car SHOW TABLES est cohérente - la table n'apparaît pas dans cette liste après avoir été supprimée. Confusément, j'ai remarqué que le répertoire / est / est parfois supprimé, mais je ne peux pas le recréer de manière cohérente. Des idées?
Matthew Cornell
Les permissions des tables sont-elles vérifiées? Vous avez peut-être changé la propriété de l'emplacement sur HDFS en un utilisateur différent.
Milind Jindal le
1

Les tables internes sont utiles si vous souhaitez que Hive gère le cycle de vie complet de vos données, y compris la suppression, tandis que les tables externes sont utiles lorsque les fichiers sont utilisés en dehors de Hive.

Muthu Palaniappan
la source
1

La table de ruche externe présente l'avantage de ne pas supprimer les fichiers lorsque nous supprimons des tables, nous pouvons définir des formats de ligne avec différents paramètres, comme serde .... délimité

user3485352
la source
1

Gardez également à l'esprit que Hive est un entrepôt de données volumineuses. Lorsque vous souhaitez supprimer une table, vous ne voulez pas perdre de gigaoctets ou de téraoctets de données. La génération, le déplacement et la copie de données à cette échelle peuvent prendre du temps. Lorsque vous déposez une ruche de table «gérée», ses données sont également supprimées. Lorsque vous supprimez une table «Externe», seule la définition de schéma du méta-magasin Hive est supprimée. Les données sur le hdfs restent toujours.

Urvishsinh Mahida
la source
1

Considérez ce scénario qui convient le mieux à la table externe:

Un travail MapReduce (MR) filtre un énorme fichier journal pour cracher les nsous-fichiers journaux (par exemple, chaque sous-fichier journal contient un journal de type de message spécifique) et la sortie ien sous-fichiers journaux, sont stockés dans hdfs.

Ces fichiers journaux doivent être chargés dans des tables Hive pour effectuer des analyses supplémentaires.Dans ce scénario, je recommanderais une ou plusieurs tables externes, car les fichiers journaux réels sont générés et détenus par un processus externe, c'est-à-dire un travail MR en plus, vous pouvez éviter un étape supplémentaire de chargement de chaque fichier journal généré dans la table Hive respective.

Suresh Vadali
la source
1

Le meilleur cas d'utilisation pour une table externe dans la ruche est lorsque vous souhaitez créer la table à partir d'un fichier CSV ou texte

anubhav
la source
0

la ruche stocke uniquement les métadonnées dans le métastore et les données d'origine à l'extérieur de la ruche lorsque nous utilisons une table externe, nous pouvons indiquer l'emplacement `` par ces dernières, nos données d'origine n'auront aucun effet lorsque nous supprimons la table

user5080458
la source
0

Lorsqu'il existe déjà des données dans HDFS, une table Hive externe peut être créée pour décrire les données. Il est appelé EXTERNAL car les données de la table externe sont spécifiées dans les propriétés LOCATION au lieu du répertoire d'entrepôt par défaut.

Lors de la conservation des données dans les tables internes, Hive gère entièrement le cycle de vie de la table et des données. Cela signifie que les données sont supprimées une fois la table interne supprimée. Si la table externe est supprimée, les métadonnées de la table sont supprimées mais les données sont conservées. La plupart du temps, une table externe est préférable pour éviter de supprimer des données avec des tables par erreur.

Sayat Satybald
la source
0

Pour les tables gérées, Hive contrôle le cycle de vie de leurs données. Hive stocke les données des tables gérées dans un sous-répertoire sous le répertoire défini par hive.metastore.warehouse.dir par défaut.

Lorsque nous supprimons une table gérée, Hive supprime les données de la table, mais les tables gérées sont moins pratiques à partager avec d'autres outils. Par exemple, disons que nous avons des données qui sont créées et utilisées principalement par Pig, mais que nous voulons exécuter certaines requêtes contre elles, mais ne pas donner à Hive la propriété des données.

À ce moment-là, une table externe est définie qui pointe vers ces données, mais n'en prend pas possession.

Ankit Nandwal
la source
0

INTERNE : la table est créée en premier et les données sont chargées plus tard

EXTERNE : des données sont présentes et une table est créée par-dessus .

Prasad L
la source
0

Dans Hive, nous pouvons également créer une table externe. Il indique à Hive de faire référence aux données qui se trouvent à un emplacement existant en dehors du répertoire de l'entrepôt. La suppression de tables externes supprimera les métadonnées mais pas les données.

Harsimranjit Singh Kler
la source
0

Je voudrais ajouter que

  1. Les tables internes sont utilisées lorsque les données doivent être mises à jour ou que certaines lignes doivent être supprimées car les propriétés ACID peuvent être prises en charge sur les tables internes, mais les propriétés ACID ne peuvent pas être prises en charge sur les tables externes.
  2. Veuillez vous assurer qu'il existe une sauvegarde des données dans la table interne car si une table interne est supprimée, les données seront également perdues.
jatin
la source
-2

En termes simples, il y a deux choses:

Hive peut gérer les choses dans l'entrepôt, c'est-à-dire qu'il ne supprimera pas les données de l'entrepôt. Lorsque nous supprimons la table:

1) Pour les tables internes, les données sont gérées en interne dans l'entrepôt. Ainsi sera supprimé.

2) Pour les tables externes, les données sont gérées éternellement depuis l'entrepôt. Il ne peut donc pas être supprimé et les clients autres que Hive peuvent également l'utiliser.

Sonu
la source