【问题标题】:How Hive stores the data (loaded from HDFS)?Hive 如何存储数据(从 HDFS 加载)?
【发布时间】:2016-01-28 19:43:57
【问题描述】:

我对 Hadoop(HDFS 和 Hbase)和 Hadoop 生态系统(Hive、Pig、Impala 等)相当陌生。我对 Hadoop 组件(例如 NamedNode、DataNode、Job Tracker、Task Tracker)以及它们如何协同工作以高效地存储数据有很好的了解。

在尝试了解 Hive 等数据访问层的基础知识时,我需要了解表的数据(在 Hive 中创建)究竟存储在哪里?我们可以在 Hive 中创建外部和内部表。由于外部表可以在 HDFS 或任何其他文件系统中,Hive 不会将此类表的数据存储在仓库中。内部表呢?该表将创建为 Hadoop 集群上的一个数据节点上的目录。一旦我们从本地或 HDFS 文件系统加载这些表中的数据,是否还会创建更多文件来将数据存储在 Hive 中创建的表中?

比如说:

  1. 名为 test_emp_feedback.csv 的示例文件已从本地文件系统带到 HDFS。
  2. 在 Hive 中创建了一个表 (emp_feedback),其结构类似于 csv 文件结构。这导致在 Hadoop 集群中创建一个目录,例如 /users/big_data/hive/emp_feedback
  3. 现在,一旦我创建表并从 test_emp_feedback.csv 加载 emp_feedback 表中的数据

Hive 是否会在 emp_feedback 目录中创建文件副本?会不会造成数据冗余?

【问题讨论】:

    标签: hadoop hive hbase hdfs bigdata


    【解决方案1】:

    创建托管表将创建一个与 Hive 仓库目录中的表名相同的目录(通常在 /user/hive/warehouse/dbname/tablename)。还有表结构(Hive 元数据) 在 Metastore(RDBMS/HCat) 中创建。

    在加载表上的数据之前,这个目录(与hive仓库下的表名同名)是空的。

    可能有两种情况。

    1. 如果表在外部,则数据根本不会复制到仓库目录。

    2. 如果表是托管的(不是外部的),当您将数据加载到表时,它会从当前 HDFS 位置移动(未复制)到Hive仓库目录9/user/hive/warehouse//)。 所以这不会复制数据。

    注意:除非数据仅供 hive 使用,否则始终建议创建外部表。删除托管表将从 HDFS(HIVE 仓库)中删除数据。

    HadoopGig

    【讨论】:

    • 当你创建一个外部表时,因为数据没有移动到仓库目录中,你仍然可以插入到外部表中吗?所以喜欢的数据会简单地添加到您在创建外部表时指定的位置吗?
    【解决方案2】:

    回答你的问题:

    对于外部表:

    Hive 不会将数据移动到其仓库目录中。如果删除外部表,则删除表元数据,但不会删除数据。

    对于内部表

    Hive 将数据移动到其仓库目录中。如果表被删除,则表元数据和数据将被删除。

    供您参考


    内部表和外部表的区别:

    对于外部表

    外部表在HDFS服务器上存储文件,但表没有完全链接到源文件。

    如果您删除外部表,该文件仍保留在 HDFS 服务器上。

    例如,如果您使用 HIVE-QL 在 HIVE 中创建一个名为“table_test”的外部表,并将该表链接到文件“file”,那么从 HIVE 中删除“table_test”不会从 HDFS 中删除“file”。

    任何有权访问 HDFS 文件结构的人都可以访问外部表文件,因此需要在 HDFS 文件/文件夹级别管理安全性。

    元数据保存在主节点上,从 HIVE 中删除外部表只会删除元数据而不是数据/文件。

    对于内部表

    存储在基于 hive.metastore.warehouse.dir 中设置的目录中,默认情况下内部表存储在以下目录/user/hive/warehouse 您可以通过更新配置文件中的位置来更改它。

    删除表会分别从主节点和 HDFS 中删除元数据和数据。 内部表文件安全性仅通过 HIVE 控制。安全需要在 HIVE 内进行管理,可能在架构级别(取决于组织)。

    Hive 可能有内部或外部表,这是一个影响数据加载、控制和管理方式的选择。

    在以下情况下使用外部表:

    数据也在 Hive 之外使用。例如,数据文件由不锁定文件的现有程序读取和处理。 即使在 DROP TABLE 之后,数据也需要保留在底层位置。如果您将多个模式(表或视图)指向单个数据集,或者如果您正在迭代各种可能的模式,这可能适用。 Hive 不应该拥有数据和控制设置、目录等,你可能有另一个程序或进程来做这些事情。 您不是基于现有表 (AS SELECT) 创建表。

    在以下情况下使用内部表:

    数据是临时的。 您希望 Hive 完全管理表和数据的生命周期。

    来源:

    HDInsight:Hive 内部和外部表介绍

    Hadoop-HIVE 中的内部和外部表

    【讨论】:

      【解决方案3】:

      不会造成数据冗余。对于托管(非外部)表,Hive 将数据移动到其仓库目录中。在您的示例中,数据将从 HDFS 上的原始位置移动到“/users/big_data/hive/emp_feedback”。 删除托管表时要小心,这也会导致 HDFS 上的数据被删除。

      【讨论】:

        【解决方案4】:

        你可以在两天内发送数据

        A) 使用 LOAD DATA INPATH 'file_location_of_csv' INTO TABLE emp_feedback; 请注意,此命令将删除源目录中的内容并创建一个内部表

        或)

        B) 使用copyFromLocalput 命令将本地文件复制到HDFS,然后创建外部表 并将数据复制到表中。现在数据不会从源中移动。您可以删除外部表,但源数据仍然可用。

        例如

        create external table emp_feedback (
          emp_id int,
          emp_name string
        )
        location '/location_in_hdfs_for_csv file';
        

        删除外部表时,只会删除 HIVE 表的元数据。数据仍然存在于 HDFS 文件位置。

        【讨论】:

        • 是否可以一步完成?我的意思是从本地文件系统读取文件而不需要将它带到 Hdfs 上?我认为 hive 应该自动在 HDFS 中制作这个文件的“副本”。当这样的表被删除时,HDFS 中的文件 broguht 应该被删除。
        • 编辑了我的答案。您可以将本地文件加载到 Hive 内部表中。如果使用 Load DATA INPATH,源文件数据将被删除。外部表将仅从 HDFS 文件创建。
        【解决方案5】:

        知道了。这是我目前能够理解的。

        这完全取决于正在创建哪种类型的表以及从文件中提取的位置。以下是可能的用例

        enter image description here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多