在hadoop生态系统中,我不断在不同的上下文中使用术语dag,比如在rdd上调用任何操作时,spark创建dag并将其提交给dag调度程序或dag模型是mapreduce模型的严格推广它是如何在hadoop或spark中实现的?
h9a6wy2h1#
您(作为spark开发人员)将“遇到”的第一个dag是将转换作为rdd应用到数据集时。创建rdd(通过从外部存储加载数据集或从本地集合创建数据集)后,您将从单节点rdd沿袭开始。
val nums = sc.parallelize(0 to 9)scala> nums.toDebugStringres0: String = (8) ParallelCollectionRDD[1] at parallelize at <console>:24 []
val nums = sc.parallelize(0 to 9)
scala> nums.toDebugString
res0: String = (8) ParallelCollectionRDD[1] at parallelize at <console>:24 []
就在转变之后,就像 map ,则创建另一个rdd,初始rdd是其父rdd。
map
val even = nums.map(_ * 2)scala> even.toDebugStringres1: String =(8) MapPartitionsRDD[2] at map at <console>:26 [] | ParallelCollectionRDD[1] at parallelize at <console>:24 []
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。
DAGScheduler
ylamdve62#
Spark lines = spark.textfile("hdfs://<file_path>",2) .这里rdd有两个分区。在上图中,a、b、c和d是这样的RDD,每个RDD有2个分区(红色框)。如图所示,每个rdd都是转换的结果。RDD之间的依赖基本上分为窄依赖和宽依赖。在父rdd的每个分区只被子rdd的一个分区使用的情况下,形成了窄依赖关系,而数据的无序排列导致了宽依赖关系。所有狭义依赖关系形成阶段1,而广义依赖关系形成阶段2。这样的阶段形成有向无环图然后将这些阶段提交给任务调度器。希望这有帮助。
lines = spark.textfile("hdfs://<file_path>",2)
2条答案
按热度按时间h9a6wy2h1#
您(作为spark开发人员)将“遇到”的第一个dag是将转换作为rdd应用到数据集时。
创建rdd(通过从外部存储加载数据集或从本地集合创建数据集)后,您将从单节点rdd沿袭开始。
就在转变之后,就像
map
,则创建另一个rdd,初始rdd是其父rdd。等等。通过使用转换操作符转换rdd,您可以构建一个转换图,它是rdd沿袭,只是rdd依赖项的有向无环图。
另一个可能会告诉你的dag是当你在rdd上执行一个操作,这将导致一个spark作业。rdd上的spark作业最终将Map到一组阶段(通过
DAGScheduler
)再次创建一个阶段图,它是一个有向无环的阶段图。spark中没有其他DAG。
我不能评论hadoop。
ylamdve62#
Spark
lines = spark.textfile("hdfs://<file_path>",2)
.这里rdd有两个分区。在上图中,a、b、c和d是这样的RDD,每个RDD有2个分区(红色框)。如图所示,每个rdd都是转换的结果。RDD之间的依赖基本上分为窄依赖和宽依赖。在父rdd的每个分区只被子rdd的一个分区使用的情况下,形成了窄依赖关系,而数据的无序排列导致了宽依赖关系。
所有狭义依赖关系形成阶段1,而广义依赖关系形成阶段2。
这样的阶段形成有向无环图
然后将这些阶段提交给任务调度器。
希望这有帮助。