Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 使用配置单元时了解HDFS中的文件分布和分区_Apache Spark_Hadoop_Hive_Hdfs_Bigdata - Fatal编程技术网

Apache spark 使用配置单元时了解HDFS中的文件分布和分区

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时,我管理分区的方式是,每个分区都有一个文件夹

一方面,在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,因此实际上最好将每个分区分布在所有节点中,而不是完整地存储在一个节点上(+副本)。