Hive如何存储数据(从HDFS加载)?

时间:2015-10-28 20:36:23

标签: hadoop hive hbase hdfs bigdata

我是Hadoop(HDFS和Hbase)和Hadoop Eco系统(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
  4. 加载emp_feedback表中的数据

    Hive是否要在emp_feedback目录中创建文件副本?它不会导致数据冗余吗?

5 个答案:

答案 0 :(得分:1)

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

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

可能有两种可能的情况。

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

  2. 如果表是受管理的(非外部),当您将数据加载到表中时,它会从当前HDFS位置移动( 未复制 ) Hive仓库目录9 /用户/配置单元/仓库//)。 因此,这不会复制数据。

  3. 警告:除非数据仅由配置单元使用,否则始终建议创建外部表。删除托管表将从HDFS(HIVE仓库)中删除数据。

    HadoopGig

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以在两天内发送数据

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

OR)

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

e.g。

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

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

答案 3 :(得分:0)

知道了。这是我到目前为止所能理解的。

这一切都取决于正在创建哪种类型的表以及文件的拾取位置。以下是可能的用例

enter image description here

答案 4 :(得分:0)

回答你问题:

对于外部表:

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

内部表格

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

供您参考

内部与外部的区别外部表格:

对于外部表格

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

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

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

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

在主节点上维护元数据,从HIVE删除外部表只删除元数据而不删除数据/文件。

内部表格

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

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

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

在以下情况下使用EXTERNAL表:

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

在以下情况下使用INTERNAL表:

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

  

来源:

     

HDInsight:Hive内部和外部表格简介

     

内部& Hadoop-HIVE中的外部表格