J'aimerais savoir comment trouver le mappage entre les tables Hive et les fichiers HDFS réels (ou plutôt les répertoires) qu'ils représentent. J'ai besoin d'accéder directement aux fichiers de la table.
Où Hive stocke-t-il ses fichiers dans HDFS?
L'emplacement où ils sont stockés sur le HDFS est assez facile à déterminer une fois que vous savez où regarder. :)
Si vous accédez à http://NAMENODE_MACHINE_NAME:50070/
dans votre navigateur, vous devriez accéder à une page avec un lien Browse the filesystem
.
Dans le répertoire $Hive_HOME/conf
, il y a le Hive-default.xml
et/ou le Hive-site.xml
qui possède la propriété Hive.metastore.warehouse.dir
. Cette valeur est l'endroit où vous souhaiterez naviguer après avoir cliqué sur le lien Browse the filesystem
.
Dans le mien, c'est /usr/Hive/warehouse
. Une fois que je navigue vers cet emplacement, je vois les noms de mes tables. En cliquant sur un nom de table (qui n'est qu'un dossier), les partitions de la table seront ensuite exposées. Dans mon cas, je ne l'ai actuellement partitionné que sur date
. Lorsque je clique sur le dossier à ce niveau, je verrai alors les fichiers (plus le partitionnement aura plus de niveaux). Ces fichiers sont où les données sont réellement stockées sur le HDFS.
Je n'ai pas tenté d'accéder directement à ces fichiers, je suppose que cela peut être fait. Je prendrais grand soin si vous songez à les éditer. :) Pour moi, je trouverais un moyen de faire ce dont j'ai besoin sans accès direct aux données Hive sur le disque. Si vous avez besoin d'accéder aux données brutes, vous pouvez utiliser une requête Hive et exporter le résultat dans un fichier. Ceux-ci auront exactement la même structure (séparateur entre les colonnes, ect) que les fichiers de la variable HDFS
. Je fais des requêtes comme celle-ci tout le temps et les convertis en CSV.
La section sur la façon d'écrire des données de requêtes à partir du disque est https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Writingdataintothefilesystemfromqueries
METTRE À JOUR
Depuis Hadoop 3.0.0 - Alpha 1, les numéros de port par défaut ont été modifiés. NAMENODE_MACHINE_NAME: 50070 devient NAMENODE_MACHINE_NAME: 9870. Utilisez ce dernier si vous utilisez Hadoop 3.x. La liste complète des modifications de ports est décrite dans HDFS-9427
Les tables de ruche ne peuvent pas nécessairement être stockées dans un entrepôt (car vous pouvez créer des tables situées n'importe où sur le HDFS).
Vous devriez utiliser la commande DESCRIBE FORMATTED <table_name>
.
Hive -S -e "describe formatted <table_name> ;" | grep 'Location' | awk '{ print $NF }'
Veuillez noter que les partitions peuvent être stockées à différents endroits et que pour obtenir l'emplacement de la partition alpha=foo/beta=bar
, vous devez ajouter partition(alpha='foo',beta='bar')
après <table_name>
.
Dans le type de terminal Hive:
Hive> set Hive.metastore.warehouse.dir;
(il imprimera le chemin)
Il est également fort possible que taper show create table <table_name>
dans Hive cli vous donne l'emplacement exact de votre table Hive.
Résumez quelques points précédemment publiés.
<property>
<name>Hive.metastore.warehouse.dir</name>
<value>/user/Hive/warehouse</value>
</property>
Pour voir les fichiers, utilisez cette commande:
hadoop fs -ls /user/Hive/warehouse
ou
http://localhost:50070
Utilities > Browse the file system
or
http://localhost:50070/Explorer.html#/
testé sous hadoop-2.7.3, Hive-2.1.1
describe formatted <table_name>;
à l'intérieur du shell ruche.
Remarquez la valeur "Location" qui indique l'emplacement de la table.
Dans Hive, les tables sont en réalité stockées à quelques endroits. En particulier, si vous utilisez des partitions (ce que vous devriez faire, si vos tables sont très grandes ou en croissance), chaque partition peut avoir son propre stockage.
Pour afficher l'emplacement par défaut où les données de la table ou les partitions seront créées si vous les créez via les commandes Hive par défaut: (insert overwrite ... partition ...
et autres):
describe formatted dbname.tablename
Pour afficher l'emplacement réel d'une partition particulière dans une table Hive, procédez comme suit:
describe formatted dbname.tablename partition (name=value)
Si vous regardez dans votre système de fichiers où une table "devrait" vivre et que vous n'y trouvez aucun fichier, il est très probable que la table soit créée (généralement de manière incrémentielle) en créant une nouvelle partition et en la pointant vers un autre emplacement. C'est un excellent moyen de construire des tables à partir d'éléments tels que les importations quotidiennes de tiers et autres, ce qui évite d'avoir à copier les fichiers ou à les stocker plusieurs fois à différents endroits.
Une autre façon de vérifier où une table spécifique est stockée serait d’exécuter cette requête sur la interface interactive de Hive:
show create table table_name;
où nom_table est le nom de la table sujet.
Voici un exemple de requête sur la table 'clients' ci-dessus:
CREATE TABLE `customers`(
`id` string,
`name` string)
COMMENT 'Imported by sqoop on 2016/03/01 13:01:49'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT
'org.Apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.Apache.hadoop.Hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://quickstart.cloudera:8020/user/Hive/warehouse/
sqoop_workspace.db/customers'
TBLPROPERTIES (
'COLUMN_STATS_ACCURATE'='true',
'numFiles'='4',
'totalSize'='77',
'transient_lastDdlTime'='1456866115')
LOCATION dans l'exemple ci-dessus, c'est sur quoi vous devriez vous concentrer. C’est votre emplacement hdfs pour l’entrepôt Hive.
N'oubliez pas d'aimer si vous aimez cette solution. À votre santé!
Si vous regardez le fichier Hive-site.xml, vous verrez quelque chose comme ceci
<property>
<name>Hive.metastore.warehouse.dir</name>
<value>/usr/Hive/warehouse </value>
<description>location of the warehouse directory</description>
</property>
/ usr/Hive/warehouse est l'emplacement par défaut de toutes les tables gérées . Les tables externes peuvent être stockées à un emplacement différent.
describe formatted <table_name>
est la commande Hive Shell qui peut être utilisée plus généralement pour trouver l'emplacement des données relatives à une table Hive.
La base de données Hive n'est rien d'autre que des répertoires au sein de HDFS avec des extensions .db.
Ainsi, à partir d'un hôte Unix ou Linux connecté à HDFS, effectuez une recherche en fonction du type de distribution HDFS:
hdfs dfs -ls -R / 2>/dev/null|grep db
ou hadoop fs -ls -R / 2>/dev/null|grep db
Vous verrez le chemin complet des répertoires de la base de données .db. Toutes les tables résideront dans les répertoires de base de données .db respectifs.
Dans le bac à sable, vous devez aller dans/apps/Hive/warehouse/et un cluster normal/utilisateur/Hive/warehouse