Hiveテーブルとそれらが表す実際のHDFSファイル(または、ディレクトリ)の間のマッピングを見つける方法を知りたいです。テーブルファイルに直接アクセスする必要があります。
HiveはファイルをHDFSのどこに保存しますか?
それらがHDFSに保存されている場所は、どこを見ればよいかがわかればかなり簡単にわかります。 :)
ブラウザでhttp://NAMENODE_MACHINE_NAME:50070/
に移動すると、Browse the filesystem
リンクのあるページに移動します。
$Hive_HOME/conf
ディレクトリには、Hive-default.xml
プロパティを持つHive-site.xml
やHive.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 で説明されています
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')
を追加する必要があることに注意してください。
Hiveターミナルタイプ:
Hive> set Hive.metastore.warehouse.dir;
(パスを出力します)
また、Hive cliにshow create table <table_name>
と入力すると、Hiveテーブルの正確な場所がわかる可能性が非常に高くなります。
以前に投稿された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でテスト済み
describe formatted <table_name>;
Hive Shell内。
テーブルの場所を示す「場所」値に注意してください。
Hiveでは、テーブルは実際にはいくつかの場所に保存されます。具体的には、パーティションを使用する場合(テーブルが非常に大きい場合や成長している場合)、パーティションごとに独自のストレージを使用できます。
デフォルトのHiveコマンドを使用して作成した場合、テーブルデータまたはパーティションが作成されるデフォルトの場所を表示するには:(insert overwrite ... partition ...
など):
describe formatted dbname.tablename
Hiveテーブル内の特定のパーティションの実際の場所を表示するには、代わりにこれを実行します。
describe formatted dbname.tablename partition (name=value)
テーブルが「存在する」はずのファイルシステムを見て、そこにファイルが見つからない場合、新しいパーティションを作成し、そのパーティションを他の場所にポイントすることでテーブルが作成される可能性が非常に高くなります。これは、サードパーティからの毎日のインポートなどからテーブルを構築する優れた方法です。これにより、ファイルをコピーしたり、別の場所に複数回保存したりする必要がなくなります。
特定のテーブルが保存されている場所を確認する別の方法は、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ロケーションです。
このソリューションが気に入ったら、忘れずに気に入ってください。乾杯!
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コマンドです。
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データベースディレクトリの下にあります。
サンドボックスでは、/ apps/Hive/warehouse /および通常のクラスター/ user/Hive/warehouseに移動する必要があります