Hive在HDFS中将文件存储在哪里?


Answers:


57

一旦知道位置,就很容易确定它们在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。我一直在进行类似的查询,并将其转换为CSV。

有关如何将查询中的数据写入磁盘的部分是https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Writingdata从查询到文件系统

更新

从Hadoop 3.0.0-Alpha 1开始,默认端口号发生了变化。NAMENODE_MACHINE_NAME:50070更改为NAMENODE_MACHINE_NAME:9870。如果您在Hadoop 3.x上运行,请使用后者。HDFS-9427中描述了端口更改的完整列表。


3
此metastore和蜂巢也使用的derby metastore有什么区别?
paolov '16

59

配置单元表可能不一定存储在仓库中(因为您可以在HDFS上的任何位置创建表)。

您应该使用DESCRIBE FORMATTED <table_name>命令。

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

请注意,分区可能存储在不同的位置,并且要获取alpha=foo/beta=bar要在partition(alpha='foo',beta='bar')其后添加的分区的位置<table_name>


请注意,分区可能存储在与默认表存储不同的位置。一种常见的ETL操作是为每个输入操作创建一个新分区,并将该分区指向该操作的文件所在的位置。(如果您已经在其他地方放置了文件,这可以避免将文件复制到默认表位置。)
Jon Watte

1
这是我查找信息的首选方法,非常简单!
smb

26

在Hive终端中输入:

hive> set hive.metastore.warehouse.dir;

(它将打印路径)


这是一个很好的提示。令人困惑的是,在Cloudera Manager中,此变量返回不同的值。在实验中,我发现激活的是后者,而不是蜂巢中的设置。有什么感觉吗?
马修·康奈尔

6

键入show create table <table_name>蜂巢cli也很可能会为您提供蜂巢表的确切位置。


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

describe formatted <table_name>; 在蜂巢壳内。

注意显示表位置的“位置”值。


2

配置单元表存储在配置单元仓库目录中。默认情况下,MapR将Hive仓库目录配置为根卷下的/ user / hive / warehouse。此默认值在$ HIVE_HOME / conf / hive-default.xml中定义。


1

检查特定表存储位置的另一种方法是在配置单元交互界面上执行以下查询

show create table table_name;

其中table_name是主题表的名称。

上面有关“客户”表的查询的示例如下所示:

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位置。

如果您喜欢此解决方案,请别忘了喜欢。干杯!


1

Hive数据库不过是HDFS中带有.db扩展名的目录。

因此,从连接到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

如果您查看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表有关的数据的位置。


实际上,在这种情况下,“ usr”被拼写为“ user”。
Dean Wampler,2015年

0

在Hive中,表实际上存储在几个地方。具体来说,如果使用分区(如果表很大或正在增长,则应使用分区),则每个分区都可以拥有自己的存储空间。

如果通过默认的HIVE命令创建表数据或分区,将显示创建表数据或分区的默认位置insert overwrite ... partition ...

describe formatted dbname.tablename

要显示HIVE表中特定分区的实际位置,请执行以下操作:

describe formatted dbname.tablename partition (name=value)

如果您在文件系统中查看表应该“存在”的位置,而在该文件系统中找不到任何文件,则很有可能通过创建新分区并将该分区指向其他位置来创建表(通常以增量方式)。这是一种通过诸如从第三方日常导入之类的东西来构建表的好方法,从而避免了必须在周围复制文件或在不同位置多次存储文件的麻烦。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.