DAG如何在RDD中工作?

Spark研究论文已经在经典的Hadoop MapReduce上规定了一种新的分布式编程模型,声称在许多情况下,特别是在机器学习上,这种简化和巨大的性能提升。 然而,在本文中,用有向无环图揭示Resilient Distributed Datasets internal mechanics的材料似乎是缺乏的。

通过调查源代码是否应该更好地学习?

即使我一直在networking上查看火花是如何从RDD计算DAG并随后执行任务的。

在高层次上,当RDD调用任何操作时,Spark会创buildDAG并将其提交给DAG调度程序。

  • DAG调度程序将操作员分成多个任务阶段。 一个阶段由基于input数据分区的任务组成。 DAG调度程序一起pipe理运营商。 例如,许多地图运营商可以安排在一个阶段。 DAG调度程序的最终结果是一系列阶段。

  • 阶段传递到任务计划程序。任务计划程序通过集群pipe理器(Spark Standalone / Yarn / Mesos)启动任务。 任务调度程序不知道阶段的依赖关系。

  • 工人在奴隶上执行任务。

让我们来看看Spark如何构buildDAG。

在高层次上,可以对RDD进行两种转型,即窄转型,宽转型 。 广泛的转变基本上导致了阶段的界限。

缩小转换 – 不需要在分区之间进行数据混洗。 例如,地图,filter等。

广泛的转换 – 要求数据被洗牌,例如reduceByKey等。

我们举一个例子来计算在每个严重级别出现多less条日志消息,

以下是以严重性级别开始的日志文件,

 INFO I'm Info message WARN I'm a Warn message INFO I'm another Info message 

并创build下面的scala代码来提取相同的,

 val input = sc.textFile("log.txt") val splitedLines = input.map(line => line.split(" ")) .map(words => (words(0), 1)) .reduceByKey{(a,b) => a + b} 

这个命令序列隐含地定义了一个RDD对象的DAG(RDD谱系),稍后将在一个动作被调用时使用。 每个RDD都保存一个指向一个或多个父母的指针,以及与元数据关于它与父系关系的types的元数据。 例如,当我们在RDD上调用val b = a.map()时,RDD b保持对其父a的引用,这是一个谱系。

为了显示RDD的血统,Spark提供了一个debugging方法toDebugString() 。 例如在splitedLines RDD上执行toDebugString()将输出如下内容:

 (2) ShuffledRDD[6] at reduceByKey at <console>:25 [] +-(2) MapPartitionsRDD[5] at map at <console>:24 [] | MapPartitionsRDD[4] at map at <console>:23 [] | log.txt MapPartitionsRDD[1] at textFile at <console>:21 [] | log.txt HadoopRDD[0] at textFile at <console>:21 [] 

第一行(从底部)显示inputRDD。 我们通过调用sc.textFile()创build这个RDD。 下面是从给定的RDD创build的DAGgraphics的更多图解视图。

RDD DAG图

一旦DAG被构build,Spark调度器将创build一个物理执行计划。 如上所述,DAG调度程序将graphics分成多个阶段,根据转换创build阶段。 狭隘的转变将被分组(pipe线)成一个单一的阶段。 所以对于我们的例子,Spark将创build两个阶段执行,如下所示:

阶段

DAG调度程序然后将这些阶段提交到任务调度程序。 提交的任务数量取决于textFile中存在的分区数量。 Fox示例考虑在这个例子中我们有4个分区,那么如果有足够的从/内核,将会有4个并行创build和提交的任务。 下图更详细地说明了这一点:

任务执行

有关更详细的信息,build议您浏览Spark创作者深入了解DAG和执行计划和生命周期的以下YouTubevideo。

  1. 高级Apache Spark – Sameer Farooqui(Databricks)
  2. 对Spark内部的深入理解–Aaron Davidson(Databricks)
  3. AmpLab Spark内部简介

开始Spark 1.4通过以下三个组件添加了数据可视化,其中还提供了DAG的清晰graphics表示。

  • Spark事件的时间轴视图

  • 执行DAG

  • Spark Streaming统计的可视化

请参阅链接了解更多信息。

Interesting Posts