apache-spark - 使用 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
并确保它们完好无损地保存?
解决方案
您对“HDFS 如何存储我们转储到其中的文件”和“Hive/Spark 如何在分区的情况下创建不同的目录”感到困惑。
让我尝试为您提供一个视角。HDFS 就像您提到的那样工作。HDFSn
根据块的大小和要存储的文件的大小将文件分成若干块。从某种意义上说,元数据(目录、权限等)是一种抽象2019-08-27.parquet
,您看到的文件 ( ) 确实分布在节点之间。Namenode 维护元数据。
但是,当我们partition
在 HDFS 上创建不同的目录时。当您想要使用分区列上的条件查询数据时,这最终会有所帮助。仅在相关目录中搜索请求的数据。如果您继续查询分区数据并编写一个explain
查看逻辑计划,您会注意到Partition Filters
whileFileScan
阶段。
分区数据仍以您提到的相同方式存储在 HDFS 上。
希望这可以帮助!
推荐阅读
- pandas - 使用 pandas 在系列中创建一个包含今天日期和日期 +1 的列
- javascript - 如何使用 ES6 在 javascript 中删除或添加项目到锯齿状数组?
- php - 为什么我在获取 API 中的变量值时出错?
- swift - 如何制作仅显示 20% 时间的插页式广告?
- javascript - '无法读取 mongodb 和 node.js 中未定义的属性'集合''
- python - django 遍历作为查询集项目的列表
- c# - HttpContext.SignInAsync 与 SigninManger.SignInAsync
- javascript - 将 imageCollection 转换为具有唯一标签值的字典
- vue.js - 从 props default (VueJS) 访问这个 / vm 实例
- node.js - Lambda NodeJS 错误:libcouchbase.so.2:无法打开共享对象文件:没有这样的文件或目录