66

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

是否应该通过研究源代码更好地学习?

4

2 回答 2

161

甚至我一直在网上寻找有关 spark 如何从 RDD 计算 DAG 并随后执行任务的信息。

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

  • DAG 调度器将算子划分为任务的阶段。一个阶段由基于输入数据分区的任务组成。DAG 调度程序将操作员流水线化在一起。例如,许多地图操作员可以安排在一个阶段。DAG 调度器的最终结果是一组阶段。

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

  • Worker 在 Slave 上执行任务。

让我们来看看 Spark 是如何构建 DAG 的。

在高层次上,有两种变换可以应用于 RDD,即窄变换和宽变换。广泛的转换基本上会导致阶段边界。

狭窄的转换- 不需要跨分区打乱数据。例如,地图、过滤器等。

广泛的转换- 需要对数据进行洗牌,例如 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 对象的 DAG(RDD 沿袭),稍后将在调用操作时使用该 DAG。每个 RDD 都维护一个指向一个或多个父节点的指针,以及关于它与父节点的关系类型的元数据。例如,当我们调用val b = a.map()RDD 时,RDDb会保留对它的 parent 的引用a,这就是一个 lineage。

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

(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。我们通过调用创建了这个 RDD sc.textFile()。下面是从给定 RDD 创建的 DAG 图的更图解视图。

RDD DAG 图

构建 DAG 后,Spark 调度程序会创建一个物理执行计划。如上所述,DAG 调度程序将图拆分为多个阶段,这些阶段是基于转换创建的。狭窄的转换将被组合在一起(流水线)成一个阶段。因此,对于我们的示例,Spark 将创建两个阶段执行,如下所示:

阶段

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

任务执行

有关更多详细信息,我建议您浏览以下 youtube 视频,其中 Spark 创建者提供了有关 DAG 和执行计划和生命周期的详细信息。

  1. 高级 Apache Spark-Sameer Farooqui (Databricks)
  2. 深入了解 Spark 内部结构 - Aaron Davidson (Databricks)
  3. AmpLab Spark 内部组件简介
于 2015-06-06T16:50:23.413 回答
4

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

  • Spark 事件的时间线视图

  • 执行 DAG

  • Spark Streaming 统计数据的可视化

有关更多信息,请参阅链接

于 2016-07-03T16:20:19.997 回答