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

问题描述 投票:63回答:11

我想知道如何找到Hive表与它们所代表的实际HDFS文件(或更确切地说,目录)之间的映射。我需要直接访问表文件。

Hive将文件存储在HDFS中的哪个位置?

hadoop hive hdfs
11个回答
51
投票

一旦知道了要查看的位置,它们存储在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-Writingdataintothefilesystemfromqueries

UPDATE

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


0
投票

在沙箱中,您需要访问/ apps / hive / warehouse /和普通的集群/用户/配置单元/仓库


0
投票

Hive数据库只是具有.db扩展名的HDFS中的目录。

因此,从连接到HDFS的Unix或Linux主机,根据HDFS分发的类型进行搜索:

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

您将看到.db数据库目录的完整路径。所有表都将驻留在相应的.db数据库目录下。


52
投票

Hive表可能不一定存储在仓库中(因为您可以创建位于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>


24
投票

在Hive终端类型:

hive> set hive.metastore.warehouse.dir;

(它将打印路径)


5
投票

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


3
投票

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

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


3
投票

总结之前发布的几点,在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下测试


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表有关的数据的位置。


0
投票

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

要显示通过默认HIVE命令创建表数据或分区的默认位置:(insert overwrite ... partition ...等):

describe formatted dbname.tablename

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

describe formatted dbname.tablename partition (name=value)

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


0
投票

检查特定表存储位置的另一种方法是在hive交互式界面上执行此查询:

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是您应该关注的地方。这是hive仓库的hdfs位置。

如果你喜欢这个解决方案,别忘了喜欢。干杯!

© www.soinside.com 2019 - 2024. All rights reserved.