web-dev-qa-db-ja.com

HiveはHDFSのどこにファイルを保存しますか?

Hiveテーブルとそれらが表す実際のHDFSファイル(または、ディレクトリ)の間のマッピングを見つける方法を知りたいです。テーブルファイルに直接アクセスする必要があります。

HiveはファイルをHDFSのどこに保存しますか?

64
Yuval

それらがHDFSに保存されている場所は、どこを見ればよいかがわかればかなり簡単にわかります。 :)

ブラウザでhttp://NAMENODE_MACHINE_NAME:50070/に移動すると、Browse the filesystemリンクのあるページに移動します。

$Hive_HOME/confディレクトリには、Hive-default.xmlプロパティを持つHive-site.xmlHive.metastore.warehouse.dirがあります。その値は、Browse the filesystemリンクをクリックした後に移動する場所です。

私の場合、/usr/Hive/warehouseです。その場所に移動すると、テーブルの名前が表示されます。テーブル名(単なるフォルダー)をクリックすると、テーブルのパーティションが表示されます。私の場合、現在はdateでのみパーティション化されています。このレベルのフォルダーをクリックすると、ファイルが表示されます(パーティションが増えるとレベルが増えます)。これらのファイルは、データが実際にHDFSに保存される場所です。

私はこれらのファイルに直接アクセスしようとはしていませんが、できると思います。あなたがそれらを編集することを考えているなら、私は素晴らしい注意を払うでしょう。 :)私にとって-私は、ディスク上のHiveデータに直接アクセスせずに、必要なことを行う方法を見つけ出します。生データにアクセスする必要がある場合は、Hiveクエリを使用して、結果をファイルに出力できます。これらは、HDFS上のファイルとまったく同じ構造(列間の区切り、ect)になります。私は常にこのようなクエリを実行し、CSVに変換します。

クエリからディスクにデータを書き込む方法に関するセクションは https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Writingdataintothefilesystemfromqueries

UPDATE

Hadoop 3.0.0-Alpha 1以降、デフォルトのポート番号に変更があります。 NAMENODE_MACHINE_NAME:50070はNAMENODE_MACHINE_NAME:9870に変更されます。 Hadoop 3.xで実行している場合は、後者を使用します。ポート変更の完全なリストは HDFS-9427 で説明されています

52
QuinnG

Hiveテーブルは必ずしもウェアハウスに格納されるとは限りません(HDFSのどこにでもテーブルを作成できるため)。

DESCRIBE FORMATTED <table_name>コマンドを使用する必要があります。

Hive -S -e "describe formatted <table_name> ;" | grep 'Location' | awk '{ print $NF }'

パーティションは異なる場所に保存される場合があり、alpha=foo/beta=barパーティションの場所を取得するには、<table_name>の後にpartition(alpha='foo',beta='bar')を追加する必要があることに注意してください。

53
Just

Hiveターミナルタイプ:

Hive> set Hive.metastore.warehouse.dir;

(パスを出力します)

24
rajnish

また、Hive cliにshow create table <table_name>と入力すると、Hiveテーブルの正確な場所がわかる可能性が非常に高くなります。

5

以前に投稿されたHive-site.xmlのいくつかのポイントを要約します。プロパティHive.metastore.warehouse.dirは、hadoop HDFSの下にあるファイルの場所を指定します

<property>
   <name>Hive.metastore.warehouse.dir</name>
   <value>/user/Hive/warehouse</value>
</property>

ファイルを表示するには、次のコマンドを使用します。

hadoop fs -ls /user/Hive/warehouse

または

http://localhost:50070
Utilities > Browse the file system
or
http://localhost:50070/Explorer.html#/

hadoop-2.7.3、Hive-2.1.1でテスト済み

3
Jonathan L

describe formatted <table_name>; Hive Shell内。

テーブルの場所を示す「場所」値に注意してください。

3
smishra

Hiveでは、テーブルは実際にはいくつかの場所に保存されます。具体的には、パーティションを使用する場合(テーブルが非常に大きい場合や成長している場合)、パーティションごとに独自のストレージを使用できます。

デフォルトのHiveコマンドを使用して作成した場合、テーブルデータまたはパーティションが作成されるデフォルトの場所を表示するには:(insert overwrite ... partition ...など):

describe formatted dbname.tablename

Hiveテーブル内の特定のパーティションの実際の場所を表示するには、代わりにこれを実行します。

describe formatted dbname.tablename partition (name=value)

テーブルが「存在する」はずのファイルシステムを見て、そこにファイルが見つからない場合、新しいパーティションを作成し、そのパーティションを他の場所にポイントすることでテーブルが作成される可能性が非常に高くなります。これは、サードパーティからの毎日のインポートなどからテーブルを構築する優れた方法です。これにより、ファイルをコピーしたり、別の場所に複数回保存したりする必要がなくなります。

0
Jon Watte

特定のテーブルが保存されている場所を確認する別の方法は、Hive interactive interface:でこのクエリを実行することです

show create table table_name;

ここで、table_nameはサブジェクトテーブルの名前です。

「customers」テーブルに対する上記のクエリの例は次のようになります。

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上記の例では、焦点を合わせる必要があります。これが、Hiveウェアハウスのhdfsロケーションです。

このソリューションが気に入ったら、忘れずに気に入ってください。乾杯!

0
Kireet Bhat

Hive-site.xmlファイルを見ると、次のようなものが表示されます。

<property>
   <name>Hive.metastore.warehouse.dir</name>
   <value>/usr/Hive/warehouse </value>
   <description>location of the warehouse directory</description>
 </property>

/ usr/Hive/warehouseは、すべての管理対象テーブルのデフォルトの場所です。外部テーブルは別の場所に保存される場合があります。

describe formatted <table_name>は、Hiveテーブルに関連するデータの場所を見つけるためにより一般的に使用できるHive Shellコマンドです。

0
balboa

Hiveデータベースは、拡張子が.dbのHDFS内のディレクトリにすぎません。

したがって、HDFSに接続されているUnixまたはLinuxホストから、HDFSディストリビューションのタイプに基づいて次のように検索します。

hdfs dfs -ls -R / 2>/dev/null|grep dbまたはhadoop fs -ls -R / 2>/dev/null|grep db

.dbデータベースディレクトリのフルパスが表示されます。すべてのテーブルは、それぞれの.dbデータベースディレクトリの下にあります。

0
Bhaskar Ghosh

サンドボックスでは、/ apps/Hive/warehouse /および通常のクラスター/ user/Hive/warehouseに移動する必要があります

0
Tutu Kumari