首页 > 解决方案 > 使用 Hive 时了解 HDFS 中的文件分布和分区

问题描述

一方面,在 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并确保它们完好无损地保存?

标签: apache-sparkhadoophivehdfsbigdata

解决方案


您对“HDFS 如何存储我们转储到其中的文件”和“Hive/Spark 如何在分区的情况下创建不同的目录”感到困惑。

让我尝试为您提供一个视角。HDFS 就像您提到的那样工作。HDFSn根据块的大小和要存储的文件的大小将文件分成若干块。从某种意义上说,元数据(目录、权限等)是一种抽象2019-08-27.parquet,您看到的文件 ( ) 确实分布在节点之间。Namenode 维护元数据。

但是,当我们partition在 HDFS 上创建不同的目录时。当您想要使用分区列上的条件查询数据时,这最终会有所帮助。仅在相关目录中搜索请求的数据。如果您继续查询分区数据并编写一个explain查看逻辑计划,您会注意到Partition FilterswhileFileScan阶段。

分区数据仍以您提到的相同方式存储在 HDFS 上。

希望这可以帮助!


推荐阅读