Apache spark 使用配置单元时了解HDFS中的文件分布和分区
一方面,在HDFS文档中,他们说: HDFS设计用于支持非常大的文件。应用程序 与HDF兼容的是那些处理大型数据集的文件。这些 应用程序只写一次数据,但读一次或多次 并要求在流速度下满足这些读取。 HDFS支持一次写入一次读取多个文件语义。典型街区 HDFS使用的大小为64 MB。因此,一个HDFS文件被分割成64个文件 MB块,如果可能,每个块将位于不同的 数据节点 这意味着每个文件都将在节点之间拆分 另一方面,当我使用Hive或Spark SQL时,我管理分区的方式是,每个分区都有一个文件夹,其中的所有文件都属于这个分区。例如:Apache spark 使用配置单元时了解HDFS中的文件分布和分区,apache-spark,hadoop,hive,hdfs,bigdata,Apache Spark,Hadoop,Hive,Hdfs,Bigdata,一方面,在HDFS文档中,他们说: HDFS设计用于支持非常大的文件。应用程序 与HDF兼容的是那些处理大型数据集的文件。这些 应用程序只写一次数据,但读一次或多次 并要求在流速度下满足这些读取。 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块大小为128MB
所以我很困惑。我不知道是整个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维护元数据
然而,当我们分区时,它会在HDFS上创建不同的目录。当您想要查询具有分区列条件的数据时,这最终会有所帮助。仅在相关目录中搜索请求的数据。如果继续查询分区数据并编写explain
来查看逻辑计划,您会注意到分区过滤器
而FileScan
阶段
分区数据仍然以您提到的相同方式存储在HDFS上
希望这有帮助 所以HDFS模块是自然抽象的,而拼花地板分区需要在引擎盖下有不同的文件夹?据我所知,HDFS上的所有内容都是以相同的方式管理的。只有在某些列上创建分区时,才会创建不同的文件夹。这些目录的维护方式与使用HDFS dfs-mkdr
创建的普通HDFS目录类似,您在HDFS中看到的所有内容都是抽象的,每个文件实际上被分解为与@vihitsah解释的块大小相等的块。然而,配置单元中的分区涉及将数据分离到单独的文件中。每个单独的.parquet文件都包含一个表数据分区,然后该文件被进一步切分为块并分布在节点上,就像其他所有HDFS文件一样。感谢您的解释。我明白是什么引起了我的困惑:我来自Cassandra world,在这个世界中,分区被有意地保存在一个节点上(副本除外),因为您通常希望找到一个特定的行并避免访问多个节点,以便实时返回结果。但是Hadoop/Hive/Spark更适合于分析,您希望利用集群中的所有CPU,因此实际上最好将每个分区分布在所有节点中,而不是完整地存储在一个节点上(+副本)。