Où Hive stocke-t-il les fichiers dans HDFS?
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?
9 réponses
L'emplacement où ils sont stockés sur le HDFS est assez facile à comprendre une fois que vous savez où chercher. :)
Si vous allez à http://NAMENODE_MACHINE_NAME:50070/
dans votre navigateur, cela devrait vous amener à une page avec un Browse the filesystem
lien.
Dans le $HIVE_HOME/conf
répertoire, il y est le hive-default.xml
et/ou hive-site.xml
qui a hive.metastore.warehouse.dir
la propriété. Cette valeur est l'endroit où vous voulez naviguer après avoir cliqué sur le Browse the filesystem
lien.
Dans le mien, c'est /usr/hive/warehouse
. Une fois que je navigue à cet endroit, je vois les noms de mes tables. En cliquant sur une nom de la table (qui est juste un dossier) exposera ensuite les partitions de la table. Dans mon cas, je l'ai actuellement seulement partitionné sur date
. Lorsque je clique sur le dossier à ce niveau, je vais alors voir les fichiers (plus de partitionnement aura plus de niveaux). Ces fichiers sont où les données sont réellement stockées sur le HDFS.
Je n'ai pas essayé d'accéder directement à ces fichiers, je suppose que cela peut être fait. Je prendrais grand soin si vous envisagez de les éditer. :)
Pour moi, j'en avais trouver un façon de faire ce que je dois sans accès direct aux données de la ruche sur le disque. Si vous avez besoin d'accéder aux données brutes, vous pouvez utiliser une requête Hive et afficher le résultat dans un fichier. Ceux-ci auront exactement la même structure (diviseur entre les colonnes, ect) que les fichiers sur le HDFS
. Je fais des requêtes comme ça tout le temps et les convertir en CSVs.
La section sur la façon d'écrire des données à partir de requêtes sur le disque est https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Writingdataintothefilesystemfromqueries
Mise à JOUR
Depuis Hadoop 3.0.0-Alpha 1, Il y a un changement dans les numéros de port par défaut. NAMENODE_MACHINE_NAME: 50070 changements à NAMENODE_MACHINE_NAME: 9870. Utilisez ce dernier si vous utilisez Hadoop 3.X. La liste complète des changements de port est décrite dans HDFS-9427
Les tables Hive ne peuvent pas nécessairement être stockées dans un entrepôt (puisque vous pouvez créer des tables situées n'importe où sur le HDFS).
Vous devez 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 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 de Ruche:
hive> set hive.metastore.warehouse.dir;
(il imprimera le chemin)
Il est également très possible que taper show create table <table_name>
dans la cli de la ruche vous donne l'emplacement exact de votre table de ruche.
describe formatted <table_name>;
à l'intérieur de la coquille de la ruche.
Notez la valeur "Location" qui indique l'emplacement de la table.
Résumer quelques points affichés plus tôt, dans la ruche-site.xml, propriété ruche.métastore.entrepôt.dir spécifie où se trouvent les fichiers sous hadoop HDFS
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
Pour afficher 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, la ruche-2.1.1
Si vous regardez le site de la ruche.fichier 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/ruche/entrepôt est l'emplacement par défaut pour tous les tableaux. Les tables externes peuvent être stockées à un emplacement différent.
describe formatted <table_name>
est la commande shell hive qui peut être utilisée plus généralement pour trouver l'emplacement des données relatives à une table hive.
Dans Hive, les tables sont en fait stockées à quelques endroits. Plus précisément, si vous utilisez des partitions (ce que vous devriez, 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 table ou les partitions seront créées si vous les Créez via les commandes ruche 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 de ruche, 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 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 pointant cette partition vers un autre emplacement. C'est un excellent moyen de construire des tables à partir de choses comme les importations quotidiennes de tiers et autres, ce qui évite d'avoir à copier les fichiers ou à les stocker plus d'une fois dans des endroits différents.
Une autre façon de vérifier où une table spécifique est stockée serait d'exécuter cette requête sur l'interface interactive hive:
show create table table_name;
Où table_name est le nom de l'objet table.
Un exemple pour la requête ci-dessus sur la table' customers ' serait quelque chose comme ceci:
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')
L'emplacement dans l'exemple ci-dessus est l'endroit sur lequel vous devriez vous concentrer. C'est votre emplacement hdfs pour Hive warehouse.
N'oublie pas d'aimer si tu aimes ça solution. À votre santé!