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

标签 apache-spark distributed

我正在运行一个 Spark 作业,但似乎任务分配得不好(见附件)。有没有办法让任务分布更均匀?谢谢!

enter image description here

最佳答案

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

  • 任务数量已均匀分布,最大变化为 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 时,考虑到第 20 个任务留在最后,每个执行者将能够完成前 4 个任务。
  • 到第二个 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
    

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

    关于apache-spark - Spark 任务似乎没有很好地分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30882360/

    相关文章:

    scala - sbt 程序集文档中的 "already part of the container?"是什么意思

    erlang - 从 shell 命令通知本地 erlang 节点的最简单方法

    java - 负载均衡器通过 TCP 并使用 TLS 协议(protocol)传递消息

    node.js - 如何防止 mongodb 支持的分布式 Nodejs Web 服务器架构中的竞争条件

    build - 使用bitbake进行分布式编译

    apache-spark - 如何在 Apache Spark 中拆分输入文件

    distinct - 使用 Apache Spark 进行高效计数

    mysql - 如何从一个节点查询mysql,然后在spark上进行过滤?

    api - 如何在 Spark 中检查 HDFS 目录是否为空

    c++ - 请求有关执行 IPC/事件捕获的建议