Spark 研究论文在经典的 Hadoop MapReduce 上规定了一种新的分布式编程模型,声称在许多情况下特别是在机器学习方面的简化和巨大的性能提升。然而,本文似乎缺乏揭示这一点的internal mechanics
材料。Resilient Distributed Datasets
Directed Acyclic Graph
是否应该通过研究源代码更好地学习?
Spark 研究论文在经典的 Hadoop MapReduce 上规定了一种新的分布式编程模型,声称在许多情况下特别是在机器学习方面的简化和巨大的性能提升。然而,本文似乎缺乏揭示这一点的internal mechanics
材料。Resilient Distributed Datasets
Directed Acyclic Graph
是否应该通过研究源代码更好地学习?
甚至我一直在网上寻找有关 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()
在splitedLines
RDD 上执行,将输出以下内容:
(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 图的更图解视图。
构建 DAG 后,Spark 调度程序会创建一个物理执行计划。如上所述,DAG 调度程序将图拆分为多个阶段,这些阶段是基于转换创建的。狭窄的转换将被组合在一起(流水线)成一个阶段。因此,对于我们的示例,Spark 将创建两个阶段执行,如下所示:
然后,DAG 调度程序将阶段提交到任务调度程序。提交的任务数取决于 textFile 中存在的分区数。Fox 示例假设我们在此示例中有 4 个分区,那么如果有足够的从属服务器/内核,将有 4 组任务并行创建和提交。下图更详细地说明了这一点:
有关更多详细信息,我建议您浏览以下 youtube 视频,其中 Spark 创建者提供了有关 DAG 和执行计划和生命周期的详细信息。
通过以下三个组件添加了数据的开始Spark 1.4
可视化,其中还提供了清晰的图形表示DAG
。
Spark 事件的时间线视图
执行 DAG
Spark Streaming 统计数据的可视化
有关更多信息,请参阅链接。