【问题标题】:Understanting file distribution and partitioning in HDFS when using Hive使用 Hive 时了解 HDFS 中的文件分布和分区
【发布时间】:2020-01-01 12:39:27
【问题描述】:

一方面,他们在 HDFS 文档中说:

HDFS 旨在支持非常大的文件。应用程序是 与 HDFS 兼容的是那些处理大型数据集的。这些 应用程序只写入一次数据,但读取一次或多次 次,并要求以流传输速度满足这些读取。 HDFS 支持文件上的一次写入多次读取语义。一个典型的块 HDFS 使用的大小为 64 MB。因此,一个 HDFS 文件被分割成 64 MB 块,如果可能,每个块将驻留在不同的 数据节点。

意味着每个文件都将在节点之间拆分。

另一方面,当我使用 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-spark hadoop hive hdfs bigdata


    【解决方案1】:

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

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

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

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

    希望这会有所帮助!

    【讨论】:

    • 所以 HDFS 块是自然抽象出来的,而 parquet 分区需要不同的文件夹?
    • 据我所知,放在 HDFS 上的所有内容都以相同的方式进行管理。仅当您在某些列上创建分区时才会创建不同的文件夹。这些目录的维护方式与使用hdfs dfs -mkdr创建的普通 HDFS 目录类似
    • 您在 HDFS 中看到的一切都是一种抽象,正如@VihitShah 所解释的那样,每个文件实际上都被分成等于块大小的块。然而,hive 中的分区涉及将数据分成单独的文件。这些单独的 .parquet 文件中的每一个都包含表数据的分区,然后该文件被进一步切成块并分布在节点上,就像所有其他 HDFS 文件一样。
    • 感谢您的解释。我明白是什么让我感到困惑:我来自 Cassandra 世界,其中分区被有意保存存储在一个节点(副本除外)上,因为您通常希望找到特定的行并避免访问许多节点以返回结果实时。但是 Hadoop/Hive/Spark 更多地用于分析,您希望在其中利用集群中的所有 CPU,因此实际上最好将每个分区分布在所有节点中,而不是将其完整地存储在一个节点(+副本)上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多