Spark:舞台边界上的磁盘I / O说明

仅在一些this之类的Spark优化文章中,我无法在官方文档中找到有关磁盘上Spark临时数据持久性的信息:

  

在每个阶段边界处,数据均由父级中的任务写入磁盘   阶段,然后通过子阶段中的任务通过网络获取。   由于它们会占用大量磁盘和网络I / O,因此阶段边界可以   价格昂贵,应尽可能避免。

每个阶段边界上对磁盘的持久性是否始终适用于HashJoin和SortMergeJoin?为什么Spark(内存引擎)在洗牌之前对tmp文件具有这种持久性?完成任务级恢复还是其他?

P.S。问题主要与Spark SQL API有关,而我也对流媒体和结构化流媒体感兴趣

UPD:在"Stream Processing with Apache Spark book"上找到了它为什么会发生的提及和更多详细信息。在参照页上查找“任务故障恢复”和“阶段故障恢复”主题。据我了解,为什么=恢复,何时=总是,因为这是Spark Core和Shuffle Service的机制,它负责数据传输。此外,所有Spark的API(SQL,流和结构化流)均基于(Spark Core / RDD的)相同的故障转移保证。因此,我认为这通常是Spark的常见行为

zhengxyx 回答:Spark:舞台边界上的磁盘I / O说明

Spark从来不是,而且从来都不是“内存引擎”。如果检查内部结构,很显然它既没有针对内存中的处理进行优化,也没有针对内存中的硬件进行优化。

相反,几乎所有设计决策都是在这样一个假设下做出的,即整个数据的大小以及单个任务的输入和输出可能超过集群和单个执行器的可用内存量。 / executor线程分别。此外,它显然设计用于商品硬件。

这样的实现可用于恢复或避免重新计算(例如,参见What does "Stage Skipped" mean in Apache Spark web UI?),但这是重新设定目的而不是最初的目标。

,

这是一个很好的问题,因为我们听说了内存中的Spark与Hadoop,因此有些混乱。这些文档太糟糕了,但是我跑了几步,环顾四周以寻找最出色的资料来源,验证了观察结果:http://hydronitrogen.com/apache-spark-shuffles-explained-in-depth.html

假定已调用一个动作-如果未声明,则避免明显的注释,假设我们不在谈论ResultStage和广播联接,那么我们在谈论ShuffleMapStage。我们首先看一下RDD。

然后,从URL借用:

    涉及洗牌的
  • DAG依赖性意味着创建单独的舞台。
  • Map操作后跟着Reduce操作和Map等。

当前阶段

  
      
  • 所有(融合)地图操作均在阶段内执行。
  •   
  • 下一阶段的需求,即减少操作-例如reduceByKey,表示在地图末尾对输出进行散列或按键排序(K)   当前阶段的操作。
  •   
  • 此分组的数据被写入执行器所在的工作器上的磁盘,或与该Cloud版本绑定的存储。 (我会   如果数据很小,则认为在内存中是可能的,但这是体系结构性的Spark   文档中所述的方法。)
  •   
  • ShuffleManager收到通知,下一个阶段可以使用散列的映射数据。 ShuffleManager跟踪所有   完成地图端所有工作后的关键位置。
  •   

下一阶段

  
      
  • 下一阶段是精简,然后通过咨询Shuffle管理器并使用块管理器从这些位置获取数据。
  •   
  • 执行人可以在其他工人上重用,也可以是新的,也可以在同一工人上重新使用。
  •   

因此,我的理解是,从结构上讲,即使有足够的内存,阶段也要写入磁盘。在给定Worker的有限资源的情况下,对于这种类型的操作会发生写入磁盘的情况。当然,更重要的一点是“ Map Reduce”实施。我总结了出色的文章,这是您的经典信息。

当然,这种持久性有助于减少容错,减少重新计算工作。

类似的方面也适用于DF。

本文链接:https://www.f2er.com/3164215.html

大家都在问