簡體   English   中英

Hive如何存儲數據(從HDFS加載)?

[英]How Hive stores the data (loaded from HDFS)?

我對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目錄中創建文件副本? 會導致數據冗余嗎?

創建托管表將在Hive倉庫目錄中創建一個與表名相同的目錄(通常位於/ user / hive / warehouse / dbname / tablename ),並且在metastore(RDBMS / HCat)中創建表結構(Hive Metadata) )。

在將數據加載到表上之前,此目錄(與配置單元倉庫中的表名相同)為空。

可能有2種情況。

  1. 如果表是外部表,則數據根本不會復制到倉庫目錄。

  2. 如果該表是托管表(非外部表),則在將數據加載到表時,會將其從當前HDFS位置移動( 而不是復制 )到Hive倉庫目錄9 / user / hive / warehouse //。 因此,這不會復制數據。

警告:始終建議創建外部表,除非該數據僅由配置單元使用。 刪除托管表將刪除HDFS(HIVE倉庫)中的數據。

HadoopGig

這不會導致數據冗余。 對於托管(非外部)表,Hive將數據移入其倉庫目錄。 在您的示例中,數據將從HDFS上的原始位置移至“ / users / big_data / hive / emp_feedback”。 小心刪除托管表,這也會導致HDFS上的數據刪除。

您可以在兩天內發送數據

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文件位置中仍然存在數據。

得到它了。 到目前為止,這是我能夠理解的。

這完全取決於要創建的表類型以及從何處拾取文件。 以下是可能的用例

在此處輸入圖片說明

回答您的問題:

對於外部表:

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可能具有內部或外部表,這是一個會影響數據加載,控制和管理方式的選擇。

在以下情況下使用EXTERNAL表:

該數據還用於Hive之外。 例如,數據文件由不鎖定文件的現有程序讀取和處理。 即使在放置DROP TABLE之后,數據也需要保留在底層位置。 如果您將多個模式(表或視圖)指向單個數據集,或者正在遍歷各種可能的模式,則可以應用此方法。 Hive不應擁有數據和控件設置,目錄等,否則您可能會有另一個程序或進程來執行這些操作。 您不是基於現有表(AS SELECT)創建表。

在以下情況下使用INTERNAL表:

數據是臨時的。 您希望Hive完全管理表和數據的生命周期。

資源:

HDInsight:Hive內部和外部表簡介

Hadoop- HIVE中的內部和外部表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM