当前位置: 首页 > 知识库问答 >
问题:

为什么sortBy转换会触发Spark作业?

梅逸清
2023-03-14

根据 Spark 文档,只有 RDD 操作可以触发 Spark 作业,并且在对其调用操作时会延迟评估转换。

我看到< code>sortBy转换函数被立即应用,并在SparkUI中显示为一个作业触发器。为什么?

共有2个答案

姜俊友
2023-03-14

根据Spark文档,Spark中只有动作触发作业,当对其调用动作时,转换被延迟评估。

总的来说,你是对的,但是正如你刚才所经历的,很少有例外,< code>sortBy就是其中之一(使用< code > ziptwithindex )。

事实上,它在Spark的JIRA中得到了报道,并以“不会修复”解决方案结束。请参阅SPARK-1021 sortByKey()在不应该启动集群作业时启动集群作业。

您可以看到作业运行时启用了DAGScheduler日志记录(以及稍后在web UI中):

scala> sc.parallelize(0 to 8).sortBy(identity)
INFO DAGScheduler: Got job 1 (sortBy at <console>:25) with 8 output partitions
INFO DAGScheduler: Final stage: ResultStage 1 (sortBy at <console>:25)
INFO DAGScheduler: Parents of final stage: List()
INFO DAGScheduler: Missing parents: List()
DEBUG DAGScheduler: submitStage(ResultStage 1)
DEBUG DAGScheduler: missing: List()
INFO DAGScheduler: Submitting ResultStage 1 (MapPartitionsRDD[4] at sortBy at <console>:25), which has no missing parents
DEBUG DAGScheduler: submitMissingTasks(ResultStage 1)
INFO DAGScheduler: Submitting 8 missing tasks from ResultStage 1 (MapPartitionsRDD[4] at sortBy at <console>:25)
DEBUG DAGScheduler: New pending partitions: Set(0, 1, 5, 2, 6, 3, 7, 4)
INFO DAGScheduler: ResultStage 1 (sortBy at <console>:25) finished in 0.013 s
DEBUG DAGScheduler: After removal of stage 1, remaining stages = 0
INFO DAGScheduler: Job 1 finished: sortBy at <console>:25, took 0.019755 s
res1: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[6] at sortBy at <console>:25
冯文彬
2023-03-14

< code>sortBy是使用< code>sortByKey实现的,它依赖于< code > RangePartitioner (JVM)或分区函数(Python)。当您调用< code > sort by /< code > sort by key 时,分区器(分区函数)会立即初始化,并对输入RDD进行采样以计算分区边界。你看到的工作对应于这个过程。

仅当您对新创建的RDD或其后代执行操作时,才会执行实际排序。

 类似资料:
  • 问题内容: “在删除不可见的类之前,需要触发重排,以使过渡按预期进行。” 我的问题是: 1)为什么需要触发回流? 2)我知道我们应该避免使用重排,如果确实如此,那么为什么作者建议使用重排以使过渡正常工作? 3)除了使用回流以外,还有其他方法可以使过渡工作吗? 谢谢。 问题答案: (有效地:“为什么我不能 轻易 在属性中使用过渡”) 简短答案 : CSS过渡依赖于元素的 开始 或 静态 属性。将元素

  • 问题内容: 在Java中: 抛出。为什么?为什么在这里投降?我不知道原因。 问题答案: 让我重命名您的班级,以使事情更加清楚。 -> 。 -> 。 仅仅因为你是一个人并不意味着你是一个人。你可能是一个。这就是将A强制转换为A的原因。 另一方面,每个是吗?答案是“是”。这就是为什么您 可以 编写如下代码: 要么 另外值得注意的是,您 可以 执行以下操作: 这样做的原因是您的变量实际上是在引用实例。因

  • 问题内容: 我想知道为什么在引用“ w”之后会引发错误。您不是通过说obj = w来创建另一个指向该w实例的指针吗?也就是说,为什么与说谢谢一样呢? 问题答案: 没有什么比早上引用JLS更重要。 JLS 6.3。宣言的范围: 块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。 和 JLS 14.2 方块:

  • reactive 收集依赖不是要通过 Proxy 触发 get 吗,为什么这里只是打印 obj(没有触发 get),也能够收集到依赖?

  • 为什么这段C代码: 给这个编译器警告? 据我所知,右边的表达式绝对是类型,而不是类型。

  • 问题内容: 我的代码中有一个。我已添加。但是它还是没有被触发。我已经尝试了很多时间,但是没有找到解决方案。 但是控制台中没有任何内容。请建议我我在做什么错。 问题答案: FocusListener不是JComboBox的适当监听器,另外一个监听器可以创建无限循环(尤其是可编辑的JComboBox), 的FocusListener是异步的,有时是太难捕捉事件是正确的订单特别是在案件JComponen