hive如何存储数据(从hdfs加载)?

gev0vcfq  于 2021-05-29  发布在  Hadoop
关注(0)|答案(5)|浏览(527)

我对hadoop(hdfs和hbase)和hadoop生态系统(hive、pig、impala等)相当陌生。我已经很好地理解了hadoop组件,比如namednode、datanode、job tracker、task tracker,以及它们如何协同工作以高效的方式存储数据。
在试图理解数据访问层(如hive)的基本原理时,我需要了解表的数据(在hive中创建的)究竟存储在哪里?我们可以在配置单元中创建外部和内部表。由于外部表可以在hdfs或任何其他文件系统中,所以hive不在仓库中存储此类表的数据。内部表格呢?此表将作为hadoop集群上的一个数据节点上的目录创建。一旦我们从本地或hdfs文件系统加载这些表中的数据,是否会创建更多的文件来将数据存储在配置单元中创建的表中?
比如说:
一个名为test_emp_feedback.csv的示例文件从本地文件系统带到hdfs。
在配置单元中创建了一个表(emp\u feedback),其结构类似于csv文件结构。这将导致在hadoop集群中创建一个目录,比如/users/big\u data/hive/emp\u feedback
现在,我创建表并从test\u emp\u feedback.csv加载emp\u feedback表中的数据
配置单元是否要在emp\u反馈目录中创建文件的副本?会不会造成数据冗余?

dxxyhpgq

dxxyhpgq1#

你可以在两天内发送数据
a) 使用“file\u location\u of \u csv”将路径中的数据加载到表emp\u feedback中;请注意,此命令将删除源目录中的内容并创建一个内部表
或)
b) 使用copyfromlocal或put命令将本地文件复制到hdfs中,然后创建外部表并将数据复制到表中。现在数据将不会从源位置移动。您可以删除外部表,但源数据仍然可用。
例如

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

删除外部表时,它只删除配置单元表的元数据。数据仍然存在于hdfs文件位置。

relj7zay

relj7zay2#

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

ghhkc1vu

ghhkc1vu3#

知道了。这就是我目前所能理解的。
这完全取决于创建哪种类型的表以及从何处提取文件。下面是可能的用例
在此处输入图像描述

cl25kdpy

cl25kdpy4#

回答您的问题:
对于外部表:
配置单元不会将数据移动到其仓库目录中。如果删除外部表,则删除表元数据,但不删除数据。
对于内部表格
配置单元将数据移动到其仓库目录中。如果表被删除,那么表元数据和数据将被删除。
供参考
内外表的区别:
对于外部表
外部表在hdfs服务器上存储文件,但表没有完全链接到源文件。
如果删除了外部表,则该文件仍保留在hdfs服务器上。
例如,如果您使用配置单元ql在配置单元中创建一个名为“table\u test”的外部表,并将该表链接到文件“file”,那么从配置单元中删除“table\u test”不会从hdfs中删除“file”。
任何有权访问hdfs文件结构的人都可以访问外部表文件,因此需要在hdfs文件/文件夹级别管理安全性。
元数据是在主节点上维护的,从配置单元中删除外部表只会删除元数据,而不会删除数据/文件。
对于内部表格
存储在基于hive.metastore.warehouse.dir中的设置的目录中,默认情况下,内部表存储在以下目录中 /user/hive/warehouse 您可以通过更新配置文件中的位置来更改它。
删除表将分别从主节点和hdfs中删除元数据和数据。内部表文件安全仅通过配置单元控制。安全性需要在配置单元内进行管理,可能是在模式级别(取决于组织)。
配置单元可能有内部或外部表,这是一个影响数据加载、控制和管理方式的选择。
在下列情况下使用外部表:
数据也在Hive外使用。例如,数据文件由不锁定文件的现有程序读取和处理。即使在删除表之后,数据也需要保留在基础位置。如果将多个模式(表或视图)指向一个数据集,或者迭代各种可能的模式,则可以应用这种方法。配置单元不应该拥有数据和控制设置、目录等,您可能有另一个程序或进程来执行这些操作。您没有基于现有表(如选择)创建表。
在下列情况下使用内部表:
数据是临时的。您希望hive完全管理表和数据的生命周期。
资料来源:
hdinsight:hive内部和外部表简介
hadoop-hive中的内部和外部表

3zwtqj6y

3zwtqj6y5#

创建托管表将创建一个与配置单元仓库目录(通常位于/user/hive/warehouse/dbname/tablename)中的表名同名的目录。表结构(配置单元元数据)也在元存储(rdbms/hcat)中创建。
在加载表上的数据之前,此目录(与配置单元仓库下的表名同名)为空。
可能有两种情况。
如果表是外部的,则根本不会将数据复制到仓库目录。
如果表是受管理的(不是外部的),则在将数据加载到表时,它将从当前hdfs位置移动(而不是复制)到配置单元仓库目录(9/user/hive/warehouse/)。所以这不会复制数据。
注意:除非数据仅由配置单元使用,否则最好始终创建外部表。删除托管表将删除hdfs(配置单元仓库)中的数据。
Hadoop Gig

相关问题