簡體   English   中英

使用Hive時,了解HDFS中的文件分發和分區

[英]Understanting file distribution and partitioning in HDFS when using Hive

一方面,他們在HDFS文檔中說:

HDFS旨在支持非常大的文件。 與HDFS兼容的應用程序是處理大型數據集的應用程序。 這些應用程序只寫入一次數據,但是它們讀取一次或多次,並要求在流速下滿足這些讀取。 HDFS支持文件的一次寫入多次讀取語義。 HDFS使用的典型塊大小為64 MB。 因此,HDFS文件被切割成64 MB塊,如果可能,每個塊將駐留在不同的DataNode上。

意味着每個文件將在節點之間分割。

另一方面,當我使用Hive或Spark SQL時,我管理分區的方式是每個分區都有一個文件夾,里面的所有文件都屬於這個分區。 例如:

/Sales
   /country=Spain
      /city=Barcelona
         /2019-08-28.parquet
         /2019-08-27.parquet
      /city=Madrid
         /2019-08-28.parquet
         /2019-08-27.parquet

假設每個文件的大小為1GB,HDFS塊大小為128 MB。

所以我很困惑。 我不明白city=Barcelonav/2019-08-28.parquet是否只保存在一個節點上(甚至與city=Barcelona/2019-08-27.parquet ),或者每個文件分配在8個節點之間節點。

如果每個文件都是分布式的,那么分區的好處是什么?

如果根據我定義的分區分發數據,HDFS如何知道這樣做? 它是否以key=value的形式查找名稱的文件夾,並確保它們保存完好?

您對“HDFS如何存儲我們轉儲到其中的文件”和“Hive / Spark如何在分區時創建不同目錄”感到困惑。

讓我試着為您提供一個視角。 HDFS就像你提到的那樣工作。 HDFS根據塊大小和要存儲的文件大小將文件分成n個塊。 元數據(目錄,權限等)是一種抽象,在某種意義上,您看到的文件( 2019-08-27.parquet )確實分布在節點之間。 Namenode維護元數據。

但是,當我們partition它會在HDFS上創建不同的目錄。 當您想要使用分區列上的條件查詢數據時,這最終會有所幫助。 僅搜索相關目錄以查找所請求的數據。 如果您繼續查詢分區數據並編寫explain以查看邏輯計划,則可以在FileScan階段注意到Partition Filters

分區數據仍然以與您提到的相同方式存儲在HDFS上。

希望這可以幫助!

暫無
暫無

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

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