簡體   English   中英

Hive 在 HDFS 中存儲文件的位置?

[英]Where does Hive store files in HDFS?

我想知道如何找到 Hive 表和它們代表的實際 HDFS 文件(或者更確切地說,目錄)之間的映射。 我需要直接訪問表文件。

Hive 將其文件存儲在 HDFS 的何處?

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')

一旦您知道要查找的位置,就很容易確定它們存儲在 HDFS 上的位置。 :)

如果您在瀏覽器中訪問http://NAMENODE_MACHINE_NAME:50070/ ,它應該會將您帶到帶有Browse the filesystem鏈接的頁面。

$HIVE_HOME/conf目錄中有具有hive.metastore.warehouse.dir屬性的hive-default.xml和/或hive-site.xml 該值是您在單擊Browse the filesystem鏈接后要導航到的位置。

在我的,它是/usr/hive/warehouse 導航到該位置后,我會看到我的表的名稱。 單擊表名稱(只是一個文件夾)將顯示表的分區。 就我而言,我目前只在date上對其進行了分區。 當我點擊這個級別的文件夾時,我會看到文件(更多的分區會有更多的級別)。 這些文件是數據實際存儲在 HDFS 上的位置。

我沒有嘗試直接訪問這些文件,我假設它可以完成。 如果您正在考慮編輯它們,我會非常小心。 :) 對我來說 - 我會想出一種方法來做我需要做的事情,而無需直接訪問磁盤上的 Hive 數據。 如果需要訪問原始數據,可以使用 Hive 查詢並將結果輸出到文件。 這些將具有與HDFS上的文件完全相同的結構(列之間的分隔符等)。 我一直做這樣的查詢並將它們轉換為 CSV。

關於如何將數據從查詢寫入磁盤的部分是https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Writingdataintothefilesystemfromqueries

更新

從 Hadoop 3.0.0 - Alpha 1 開始,默認端口號發生了變化。 NAMENODE_MACHINE_NAME:50070 更改為 NAMENODE_MACHINE_NAME:9870。 如果您在 Hadoop 3.x 上運行,請使用后者。 HDFS-9427中描述了端口更改的完整列表

在 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 表存儲在 Hive 倉庫目錄中。 默認情況下,MapR 將 Hive 倉庫目錄配置為根卷下的/user/hive/warehouse 此默認值在$HIVE_HOME/conf/hive-default.xml 中定義。

檢查特定表存儲位置的另一種方法是在hive 交互界面上執行此查詢

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是您應該關注的地方。 那是您的 hdfs 配置單元倉庫的位置。

如果您喜歡此解決方案,請不要忘記喜歡。 干杯!

Hive 數據庫只不過是 HDFS 中帶有 .db 擴展名的目錄。

因此,從連接到 HDFS 的 Unix 或 Linux 主機,根據 HDFS 發行版的類型進行以下搜索:

hdfs dfs -ls -R / 2>/dev/null|grep dbhadoop fs -ls -R / 2>/dev/null|grep db

您將看到 .db 數據庫目錄的完整路徑。 所有表都將駐留在各自的 .db 數據庫目錄下。

如果您查看 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 shell 命令,可以更廣泛地使用它來查找與 hive 表有關的數據的位置。

在 Hive 中,表實際上存儲在幾個地方。 具體來說,如果您使用分區(您應該這樣做,如果您的表非常大或不斷增長),那么每個分區都可以擁有自己的存儲空間。

如果您通過默認 HIVE 命令創建表數據或分區,則顯示將創建表數據或分區的默認位置:( insert overwrite ... partition ...等):

describe formatted dbname.tablename

要顯示 HIVE 表中特定分區的實際位置,請執行以下操作:

describe formatted dbname.tablename partition (name=value)

如果您查看表“應該”所在的文件系統,並且在那里找不到文件,則很可能是通過創建新分區並將該分區指向其他位置來創建表(通常是增量式的)。 這是從第三方的日常導入等內容構建表的好方法,這樣可以避免復制文件或將它們多次存儲在不同的地方。

在沙箱中,你需要去 /apps/hive/warehouse/ 和普通集群 /user/hive/warehouse

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM