有向无环图是如何在hadoop或spark中实现的?

i34xakig  于 2021-06-01  发布在  Hadoop
关注(0)|答案(2)|浏览(697)

在hadoop生态系统中,我不断在不同的上下文中使用术语dag,比如
在rdd上调用任何操作时,spark创建dag并将其提交给dag调度程序

dag模型是mapreduce模型的严格推广
它是如何在hadoop或spark中实现的?

h9a6wy2h

h9a6wy2h1#

您(作为spark开发人员)将“遇到”的第一个dag是将转换作为rdd应用到数据集时。
创建rdd(通过从外部存储加载数据集或从本地集合创建数据集)后,您将从单节点rdd沿袭开始。

val nums = sc.parallelize(0 to 9)
scala> nums.toDebugString
res0: String = (8) ParallelCollectionRDD[1] at parallelize at <console>:24 []

就在转变之后,就像 map ,则创建另一个rdd,初始rdd是其父rdd。

val even = nums.map(_ * 2)
scala> even.toDebugString
res1: String =
(8) MapPartitionsRDD[2] at map at <console>:26 []
 |  ParallelCollectionRDD[1] at parallelize at <console>:24 []

等等。通过使用转换操作符转换rdd,您可以构建一个转换图,它是rdd沿袭,只是rdd依赖项的有向无环图。
另一个可能会告诉你的dag是当你在rdd上执行一个操作,这将导致一个spark作业。rdd上的spark作业最终将Map到一组阶段(通过 DAGScheduler )再次创建一个阶段图,它是一个有向无环的阶段图。
spark中没有其他DAG。
我不能评论hadoop。

ylamdve6

ylamdve62#


Spark lines = spark.textfile("hdfs://<file_path>",2) .
这里rdd有两个分区。在上图中,a、b、c和d是这样的RDD,每个RDD有2个分区(红色框)。如图所示,每个rdd都是转换的结果。RDD之间的依赖基本上分为窄依赖和宽依赖。在父rdd的每个分区只被子rdd的一个分区使用的情况下,形成了窄依赖关系,而数据的无序排列导致了宽依赖关系。
所有狭义依赖关系形成阶段1,而广义依赖关系形成阶段2。
这样的阶段形成有向无环图
然后将这些阶段提交给任务调度器。
希望这有帮助。

相关问题