【问题标题】:Where does Hive store files in HDFS?Hive 在 HDFS 中将文件存储在哪里?
【发布时间】:2011-06-30 19:30:48
【问题描述】:

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

Hive 将其文件存储在 HDFS 的什么位置?

【问题讨论】:

标签: hadoop hive hdfs


【解决方案1】:

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

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

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

请注意,分区可能存储在不同的位置,要获取alpha=foo/beta=bar 分区的位置,您必须在&lt;table_name&gt; 之后添加partition(alpha='foo',beta='bar')

【讨论】:

  • 请注意,分区可能存储在与默认表存储不同的位置。一种常见的 ETL 操作是为每个输入操作创建一个新分区,并将分区指向该操作的文件所在的位置。 (如果您在其他地方已经有文件,这可以避免将文件复制到默认表位置。)
  • 这是我查找信息的首选方法,太简单了!
【解决方案2】:

一旦您知道在哪里查找,就很容易找出它们在 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

更新

自 Hadoop 3.0.0 - Alpha 1 以来,默认端口号发生了变化。 NAMENODE_MACHINE_NAME:50070 更改为 NAMENODE_MACHINE_NAME:9870。如果您在 Hadoop 3.x 上运行,请使用后者。 HDFS-9427

中描述了端口更改的完整列表

【讨论】:

  • 这个 metastore 和 hive 也使用的 derby metastore 有什么区别?
【解决方案3】:

在 Hive 终端类型中:

hive> set hive.metastore.warehouse.dir;

(它会打印路径)

【讨论】:

  • 这是一个很棒的提示。令人困惑的是,在 Cloudera Manager 中,此变量返回不同的值。在实验中,我发现激活的是后者,而不是蜂巢中的设置。有什么感觉吗?
【解决方案4】:

在 hive cli 中键入 show create table &lt;table_name&gt; 也很有可能为您提供 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 下测试

    【讨论】:

      【解决方案6】:

      describe formatted &lt;table_name&gt;; 在蜂巢壳内。

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 即使 Cloudera 也是第一种方式!
        【解决方案8】:

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

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

        hdfs dfs -ls -R / 2&gt;/dev/null|grep db 要么 hadoop fs -ls -R / 2&gt;/dev/null|grep db

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

        【讨论】:

          【解决方案9】:

          另一种检查特定表存储位置的方法是在 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 是您应该关注的地方。那是您的 hdfs 配置单元仓库的位置。

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

          【讨论】:

            【解决方案10】:

            如果您查看 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 &lt;table_name&gt; 是 hive shell 命令,可以更普遍地用于查找与 hive 表有关的数据的位置。

            【讨论】:

            • 其实在这种情况下,“usr”拼写为“user”。
            【解决方案11】:

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

            如果您通过默认 HIVE 命令创建表数据或分区,则显示默认位置:(insert overwrite ... partition ... 等):

            describe formatted dbname.tablename
            

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

            describe formatted dbname.tablename partition (name=value)
            

            如果您在文件系统中查看“应该”存在表的文件系统,但在那里没有发现任何文件,则很可能是通过创建新分区并将该分区指向其他位置来创建表(通常是增量)。这是一种从第三方日常导入等内容构建表格的好方法,避免了复制文件或将它们多次存储在不同的地方。

            【讨论】:

              【解决方案12】:

              在 Sandbox 中,您需要选择 /apps/hive/warehouse/ 和普通集群 /user/hive/warehouse

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-05-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-08-31
                • 2011-03-06
                相关资源
                最近更新 更多