Spark和hdfs中的数据局部性

4sup72z8  于 6个月前  发布在  Apache
关注(0)|答案(1)|浏览(47)

我想了解spark如何选择哪个spark节点读取哪个文件的机制。例如,如果我们有hdfs集群和一个spark集群。我们有一个以csv形式写入hdfs的数据集,它是分区的。所以我们有许多代表不同分区的文件,每个文件都存储为一组hdfs块,据我所知,这些块通常是64 MB。这些块可能存储在不同的机器上。我现在理解的唯一方法是,我们每个hdfs文件都有一个分区,Spark集群节点将随机分配给文件,然后他们将使用一些hdfs-客户端读取该文件。这是正确的还是Spark以某种方式优化了哪些spark集群节点读取哪些hdfs文件。
我读过文档,也读过spark白皮书,但他们没有描述这种机制。似乎文档通常说Spark可以实现计算和存储。

qc6wkl3g

qc6wkl3g1#

非云/本地Spark

保持简单,省去动态资源分配和节点故障时重新计算。
回到过去,这又被称为传统/经典的Spark HDFS,意思是:
1.安装Spark是为了与集群上的资源管理器(比如YARN)一起工作,
1.当Spark应用程序启动时,它通过资源管理器获取工作节点上的Executors和内存中的有限资源集,而不知道将读取哪些文件,
1.当Spark应用程序实际运行代码时,* 代码将被带到同一集群上的数据 *,如下图所示-参见https://spark.apache.org/docs/latest/cluster-overview.html。也就是说,数据位于HDFS数据节点上,从Spark的Angular 来看,这与工作节点同义。但您可能没有在所有节点上获得Executors。所以,启动它并从磁盘读取的Action将把Spark代码发送给那些(工作者/数据)文件的数据块存在或不存在的节点。您可能在所有节点上都有Executors,也可能没有。这就是数据局部性的来源;为了执行一些有意义的逻辑,如果你有一个Executor在那里,你会在同一个节点上处理数据,以避免本地网络,机架延迟等。否则,Executor将需要从机架或机架/节点读取。这是较慢的。HDFS的名称节点跟踪所有数据块,Spark参考了这一点,并知道在理想情况下将任务发送到哪里,或者在不太优化的情况下将Taks发送到哪里并从中读取。

  • 为了回答你的第一个问题 *,Spark没有选择任何东西,而是根据Executor和Data Locality进行优化。机架和节点对使用哪个Executor有影响。

x1c 0d1x的数据
在执行过程中会发生节点之间的 Shuffle 和数据溢出到磁盘,这在这里有点偏离主题。
当程序在代码库中移动时,可能需要找到其他Executors来进行内存计算等。这可能在同一个节点上,也可能在其他节点上。

云上Spark

  • 你的第二个问题。*看起来文档通常说Spark可以扩展计算和存储。 在传统的内部部署中,情况并非如此,因为我们尽可能多地处理数据。

在云场景中,计算和存储实际上是分离的,因此您可以使用静态数据和动态分配/弹性计算的存储;保留的示例仍然与存储分离。因此,Spark使用Name Node来查找从哪里读取,数据本地性方面与“将代码带到数据”不同。

相关问题