我有一个Spark独立集群(由两个工作人员组成,每个工作人员具有2个内核)。我运行一个SQLQuery,它联接2个数据帧并显示结果。我对上面的示例有一些疑问。
val df1 = sc.read.text(fn1).toDF()
val df2 = sc.read.text(fn2).toDF()
df1.createOrReplaceTempView("v1")
df2.createOrReplaceTempView("v2")
val df_join = sc.sql("SELECT * FROM v1,v2 WHERE v1.value=v2.value AND v2.value<1500").show()
DAG计划程序-任务数
到目前为止,据我所了解,当我提交应用程序时,会生成一个SparkContext来处理Job(其中Job是打印结果行)。 SparkContext创建一个Task Scheduler实例,然后创建DAGScheduler。通过一个简单的事件机制,DAGScheduler处理要执行的作业(代码中的 handleJobSubmitted 函数)。 SparkSQL查询已转换为物理执行计划(通过Catalyst Optimizer),然后转换为RDD-Graph(具有 toRdd 函数)。 DagScheduler收到RDD-Graph并递归创建所有阶段。
我不明白它在最后一个阶段如何找到任务数(在执行任何阶段之前),请记住结果阶段是执行联接(并打印结果)的阶段。直到父级结束执行后,我们才能知道数据的数量(以及rdds及其分区的数量,它们定义了任务的数量)。
阶段的并行执行
两个第一阶段中的每个阶段都彼此独立,因为它从不同的文件加载数据。我读过许多帖子,它们说 MAY 之间没有依赖性的阶段是从集群并行执行的。什么条件意味着独立阶段的任务可以并行执行?
任务依赖项
最后,我了解到任务计划程序不了解阶段依赖性。如果我记住Spark中的每个Stage是一个TakSet(又名一组非依赖任务,每个具有相同功能的任务都打包有不同的数据分区),那么TaskScheduler也不知道不同Stage的任务之间的依赖关系。结果,任务如何以及何时知道执行任务的数据? 例如,如果该任务知道apriori在哪里寻找其输入数据,则可以在它们可用后立即启动。