Spark任务似乎没有很好地分布

时间:2015-06-17 04:29:40

标签: apache-spark distributed

我正在运行Spark工作,似乎任务分配不均匀(参见附件)。有没有办法让任务更均匀地分布?谢谢!

enter image description here

4 个答案:

答案 0 :(得分:1)

仔细查看发布的图像,我可以确定两个主要事实:

  • 任务数量已均匀分布,最多可更改20个任务。
  • 为每个执行者分配的运行时间有显着差异,从3.0分钟(约80个任务)到17.0分钟(约60个任务)。

这让我想知道你的应用程序的性质。是否所有任务都相同或者其中一些任务需要更多时间来完成其他任务?如果任务是异构的,则需要更仔细地查看您的问题。想象一下以下场景:

  • 任务数量:20,每个人需要 10 秒才能完成,但最后一个除外:

    Task 01: 10 seconds
    Task 02: 10 seconds
    Task 03: 10 seconds
    Task ...
    Task 20: 120 seconds
    
  • 执行人数: 4 (每个人都有一个核心)

如果我们必须均匀分配任务,我们会看到每个执行者总共需要处理5个任务。考虑到一个执行程序被分配了第20个任务,需要120秒才能完成,执行流程如下:

  • 到第二个40,每个执行者都可以完成前4个任务,考虑到第20个任务留在最后。
  • 到第二个50,每个遗嘱执行人都会完成所有任务。剩下的遗嘱执行人仍然会计算第20个任务,这些任务将在120秒后完成。

最后,用户界面会显示与您类似的结果,任务数量均匀分布,但不是实际的计算时间。

Executor 01 -> tasks completed: 5 -> time: 0:50 minutes
Executor 02 -> tasks completed: 5 -> time: 0:50 minutes
Executor 03 -> tasks completed: 5 -> time: 0:50 minutes
Executor 04 -> tasks completed: 5 -> time: 2:40 minutes

虽然不一样,但在你的情况下可能会发生类似的事情。

答案 1 :(得分:0)

我认为任务在不同的工作人员中均匀分布,因为每个任务在地址栏中都有不同的端口号。

答案 2 :(得分:0)

只看你的截图,很难诊断一些东西。但是,您可能需要考虑两件事:

  • Spark UI(截至1.3.1,我还没有在1.4.0中尝试)只显示已完成任务的统计数据总和。如果您在应用程序运行时使用此屏幕截图,则很可能某些任务正在运行,并且在统计数据中尚未显示!

  • 在给定的Spark阶段,您不能拥有比数据分区更多的任务。如果没有更多的代码,很难说,但是你可能想要使用rdd.partition()函数,通常你可以在处理之前使用rdd.repartition(sparkContext.getConf.getInt("spark.executor.instances", defaultValueInt)生成更多的分区,从而平滑执行程序的负载

    < / LI>

答案 3 :(得分:0)

如果你想要平等分配,你可以在将文件加载到RDD时使用spark的分区功能,

val ratings = sc.textFile(File_name,partition)

就像你有10个节点,每个节点有2个核心,那么你可以有20个分区值,同样。