【问题标题】:Where is HIVE metadata stored by default?HIVE 元数据默认存储在哪里?
【发布时间】:2015-11-30 22:06:22
【问题描述】:

我使用以下方法在Hive 创建了一个外部表:

create external table hpd_txt(
WbanNum INT,
YearMonthDay INT , 
Time INT, 
HourlyPrecip INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
stored as textfile
location 'hdfs://localhost:9000/user/hive/external';

现在此表在位置*/hive/external 中创建。

第 1 步:我使用以下方法在此表中加载数据:

load data inpath '/input/hpd.txt' into table hpd_txt;

数据成功加载到指定路径(*/external/hpd_txt)

第 2 步:我使用以下命令从 */hive/external 路径中删除表:

hadoop fs -rmr /user/hive/external/hpd_txt

问题:

  1. 为什么要从原始路径中删除表? (*/input/hpd.txt 已从 hdfs 中删除,但表是在 */external 路径中创建的)
  2. 按照步骤 2 从 HDFS 删除表后,我再次使用显示表;它仍然在外部路径中提供表 hpd_txt。 那么这是从哪里来的呢。

提前致谢。

【问题讨论】:

    标签: hadoop hive hdfs


    【解决方案1】:

    在浏览了您帮助 cmets 和其他帖子后,我找到了问题的答案。 如果我使用 LOAD INPATH 命令,那么它将源文件“移动”到正在创建外部表的位置。这虽然不会影响掉表的情况,但改变位置并不好。因此,如果在内部表中加载数据,请使用本地 inpath。

    要从位于 HDFS 中的文件加载外部表中的数据,请使用 CREATE 表查询中将指向源文件的位置,例如:

    create external table hpd(WbanNum string,
    YearMonthDay string , 
    Time string, 
    hourprecip string)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    stored as textfile
    location 'hdfs://localhost:9000/input/hpd/';
    

    因此,此示例位置将指向此路径中 HDFS 中已存在的数据。所以这里不需要使用 LOAD INPATH 命令。

    将源文件存储在其私有专用目录中是一种很好的做法。这样在创建外部表时不会有歧义,因为数据位于适当管理的目录系统中。

    非常感谢帮助我理解这个概念的伙计们!干杯!

    【讨论】:

      【解决方案2】:
      1. 不要使用加载路径命令。 Load 操作用于将数据移动(而不是复制)到相应的 Hive 表中。使用 put 或 copyFromLocal 将文件从非 HDFS 格式复制到 HDFS 格式。只需在执行 put 命令后在 create table 中提供 HDFS 文件位置即可。

      2. 删除表不会从磁盘中删除 HDFS 文件。这就是外部表的优势。 Hive 表只存储元数据以访问数据文件。 Hive 表将数据文件的实际数据存储在 HIVE 表中。如果您删除表,则数据文件在 HDFS 文件位置中保持不变。但是对于内部表,如果你删除表,元数据和数据都会被删除。

      【讨论】:

        【解决方案3】:

        EXTERNAL 关键字可让您创建表并提供 LOCATION,以便 Hive 不会为此表使用默认位置。如果您已经生成了数据,这会很方便。否则,您将加载数据(通常或通过在配置单元表指向的目录中创建文件) 删除 EXTERNAL 表时,表中的数据不会从文件系统中删除。 EXTERNAL 表指向任何 HDFS 位置进行存储,而不是存储在配置属性 hive.metastore.warehouse.dir 指定的文件夹中。

        来源:Hive docs

        因此,在您的第 2 步中,删除文件 /user/hive/external/hpd_txt 会删除数据源(指向表的数据)但该表仍然存在并将继续指向 hdfs://localhost:9000 /user/hive/external

        @Anoop :不确定这是否回答了您的问题。如果您还有任何问题,请告诉我。

        【讨论】:

        • 嗨,阿尼尔。感谢回复。是的,它帮助我消除了疑问。但主要的疑问仍然悬而未决。 (我已经提到这一点作为对上述答案的评论)。请帮忙:)
        • @Anoop 我可以知道你到底关心什么......或者你可以把它作为你问题的一部分。
        【解决方案4】:

        Hive 不知道您删除了这些文件。 Hive 仍然希望在您指定的位置找到文件。你可以在 HDFS 中做任何你想做的事情,而这不会传达给 hive。如果事情发生变化,你必须告诉 hive。

        hadoop fs -rmr /user/hive/external/hpd_txt
        

        例如,上面的命令不会删除表,它只是删除文件。该表仍然存在于配置单元元存储中。如果要删除表,请使用:

        drop if exists tablename;
        

        由于您将表创建为外部表,因此该表将从配置单元中删除。如果您没有删除它们,这些文件将保留。如果您想删除一个外部表和该表正在读取的文件,您可以执行以下操作之一:

        1. 删除表,然后删除文件
        2. 将表更改为托管表并删除表

        最后,hive 的元存储位置默认位于/usr/hive/warehouse。

        【讨论】:

        • 感谢invoketheshell 澄清!我想知道的另一件事是,为什么 HDFS dat 中的文件被加载到从最初使用 -copyFromLocal 命令存储的路径中删除的表中?
        • -copyFromLocal 与我相信的 -put 相同。它应该复制文件并将其放置在 HDFS 内的指定目标中。
        • 其实我观察到一件事。当我在某个位置创建表时说 /dir...... 然后将数据加载到表中(加载数据 inpath....),该文件不再位于较早的路径中(复制到的路径) , 但现在存在于 /dir 路径中。是不是因为数据还在hdfs中,只是路径正在改变?
        • 对不起,我不清楚你在这里问什么。
        • 理想情况下不应删除源文件。我无法复制你的场景。我在普通文件系统和 hdfs 文件系统中都看到了表格。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 2018-08-19
        • 2019-07-27
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        • 2012-04-21
        相关资源
        最近更新 更多