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

在Spark阶段有可能重新排序任务吗

徐秋月
2023-03-14
df.rdd
  .mapPartitionsWithIndex((i,rows) => Iterator((i,rows.size)))
  .toDF("id", "numElements")

我看到分区中的行数和任务的执行时间之间有明显的相关性。由于我的数据集具有无法更改的偏斜性质,我有几个分区,其元素数(>8000)远高于平均值(~3000)。一个分区的平均执行时间为10-20分钟,较大的可达3小时以上。我的一些最大的分区具有较高的ID,因此相应的任务几乎是在阶段结束时执行的。结果,其中一个Spark阶段在最后5个任务上挂起3个小时。

问题:

是否有一种方法可以重新排序分区的ID,以便首先执行来自最大分区的任务?或者等效地,是否有一种方法可以改变任务的执行顺序?

    null

共有1个答案

诸正谊
2023-03-14

不,没有。如果是这样的话,现在应该在文件里了。

您无法控制任务的顺序(/优先级)--因为Spark任务调度程序没有定义这种顺序/优先级的接口。

Spark的工作方式与Informatica不同。一个阶段--因此所有的任务--必须在下一个阶段可以为给定的操作开始之前完全完成。

 类似资料:
  • 我有一个Spark UDF,它需要在executor的本地磁盘上安装一个特定的文件(在我的例子中是MATLAB运行时)(我们使用的是YARN)。因为我不能直接访问executor机器,所以我必须找到另一种方法在集群上部署我的运行时。由于文件非常大,我不能在每次调用UDF时安装/删除它,所以我考虑了以下策略: null 似乎没有办法为执行者添加关机钩子(Spark worker shutdown-如

  • 下面我们假设每个时间点只有一个Spark作业在运行。 以下是我所理解的在Spark中发生的事情: 创建时,每个工作节点都启动一个执行器。执行程序是单独的进程(JVM),它连接回驱动程序。每个执行器都有驱动程序的jar。退出驱动程序,关闭执行程序。每个执行程序可以保存一些分区。 执行作业时,将根据沿袭图创建执行计划。 执行作业被拆分为多个阶段,其中阶段包含相同数量的相邻转换和操作(在沿袭图中),但不

  • 我对Spark,Scala和Cassandra都是新手。使用Spark,我试图从MySQL获取一些ID。 我可以看到在控制台打印的ID。 当我试图在每个提取id上运行相同的函数时 它给出与例外相同的例外 在阅读spark-shell中的Apache spark:“sparkException:Task not serializable”后,我尝试将@transient添加到RDDs中

  • null 每当我尝试访问sc时,我会得到以下错误。我在这里做错了什么?

  • 我的抽屉菜单中列出了许多页面/片段,用户可能会经常在这些页面/片段之间切换,我希望它们在后台堆栈中,以便它们可以导航回来,但我只希望每个片段的一个实例在后台堆栈中,以便用户不必按太多次才能退出应用程序。我不知道如何在不删除页面的情况下有效地“重新排序”后台。 目前,当我更改页面时,我使用这段代码来更改片段,并确保它只在后堆栈中出现一次 我在onBackPush中使用此代码 这可以工作,但这意味着它

  • 问题内容: 我们在Spark上使用Redis来缓存键值对,这是代码: 但是编译器给了我这样的反馈: 有人可以告诉我如何序列化从Redis获得的数据。非常感谢。 问题答案: 在Spark中,s(如此处)上的函数被序列化并发送给执行程序进行处理。这意味着这些操作中包含的所有元素都应该可序列化。 Redis连接不可序列化,因为它打开了到目标DB的TCP连接,该TCP连接已绑定到创建它的机器。 解决方案是