火花研究论文已经在经典的Hadoop MapReduce上提出了一个新的分布式编程模型,在许多情况下,特别是在机器学习方面,它的简化和巨大的性能提升。然而,本文缺乏利用internal mechanics在Resilient Distributed Datasets上实现Directed Acyclic Graph的材料。
应该通过调查源代码来更好地学习吗?
发布于 2015-06-06 16:50:23
就连我也一直在网上寻找火花如何从RDD中计算DAG并随后执行任务。
在高级别上,当在RDD上调用任何操作时,Spark将创建DAG并将其提交给DAG调度程序。
让我们来看看星火如何构建DAG。
在高层次上,有两个转换可以应用到RDDs上,即窄转换和宽转换。广泛的转换基本上导致了舞台边界的形成。
窄带转换--不需要在分区之间对数据进行洗牌。例如,地图,过滤器等。
wide transformation --要求对数据进行洗牌,例如,reduceByKey等。
让我们以一个例子来计算在每个严重级别上显示了多少日志消息,
下面是以严重级别开始的日志文件,
INFO I'm Info message
WARN I'm a Warn message
INFO I'm another Info message并创建以下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对象(RDD沿袭)的DAG,在调用操作时将使用该DAG。每个RDD都维护一个指向一个或多个父级的指针,以及关于它与父级的关系类型的元数据。例如,当我们在RDD上调用val b = a.map()时,RDD b保留对其父a的引用,这是一个沿袭。
为了显示RDD的谱系,Spark提供了一个调试方法toDebugString()。例如,在toDebugString() RDD上执行splitedLines,将输出以下内容:
(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 []第一行(从底部)显示输入的RDD。我们通过调用sc.textFile()创建了这个RDD。下面是从给定的RDD创建的DAG图的更多的图表视图。

一旦DAG生成,星火调度程序就会创建一个物理执行计划。如前所述,DAG调度程序将图分成多个阶段,阶段是基于转换创建的。狭窄的转换将被分组(管道内衬)为一个单一的阶段。因此,对于我们的示例,Spark将创建两个阶段执行,如下所示:

然后,DAG调度程序将将各个阶段提交到任务调度程序中。提交的任务数量取决于textFile中存在的分区数。Fox示例考虑本例中有4个分区,如果有足够多的从/核,则将创建4组任务并并行提交。下图更详细地说明了这一点:

要获得更详细的信息,我建议您查看以下youtube视频,其中火花创建者详细介绍了DAG、执行计划和生命周期。
发布于 2016-07-03 16:20:19
https://stackoverflow.com/questions/25836316
复制相似问题