【问题标题】:Spark tasks stuck at RUNNINGSpark 任务卡在 RUNNING
【发布时间】:2018-06-29 03:19:50
【问题描述】:

我正在尝试在我的 Yarn 集群上运行 Spark ML 管道(从 JDBC 加载一些数据,运行一些转换器,训练一个模型),但每次运行它时,都会出现一对 - 有时是一个,有时是 3 或 4 个 -我的执行者中的一些在运行他们的第一个任务集时遇到了困难(他们的 3 个核心中的每一个都需要 3 个任务),而其余的则正常运行,一次检查 3 个。

在 UI 中,您会看到如下内容:

到目前为止我观察到的一些事情:

  • 当我将我的执行程序设置为使用 1 个内核和 spark.executor.cores(即一次运行 1 个任务)时,不会出现此问题;
  • 卡住的执行者似乎总是那些必须将一些分区改组才能运行任务的执行者;
  • 卡住的任务最终会被另一个实例成功推测执行;
  • 有时,单个任务会卡在原本正常的执行程序中,但其他 2 个内核会继续正常工作;
  • 卡住的执行器实例看起来一切正常:CPU 处于 ~100%,有足够的内存空闲,JVM 进程处于活动状态,Spark 或 Yarn 都没有记录任何异常,它们仍然可以接收来自驱动程序,例如“放弃这个任务,其他人已经推测性地执行了它”——尽管出于某种原因,他们没有放弃它
  • 那些执行者永远不会被司机杀死,所以我想他们继续发送他们的心跳就好了;

关于可能导致此问题的原因或我应该尝试什么的任何想法?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    TLDR:在责备 Spark 之前,请确保您的代码是线程安全且无竞争条件的。

    想通了。对于后代:使用线程不安全的数据结构(可变的 HashMap)。由于同一台机器上的执行程序共享一个 JVM,这会导致数据竞争锁定单独的线程/任务。

    结果:当您拥有spark.executor.cores > 1(并且您可能应该)时,请确保您的代码是线程安全的。

    【讨论】:

    • 很好奇 - 你是如何发现它是线程不安全的数据结构?线程转储执行程序?
    • 没有完全理解那部分。我能够将其缩小到特定的模块,并且多次被多线程代码咬在后面,我能够弄清楚。
    • 这是一个非常好的建议。谢谢
    • @ktdrv 您是否使用了 spark 本地模式?因为我很确定每个 spark executor 在集群模式下使用它自己的 JVM
    • 我很确定这是纱线,但我认为在这种情况下模式并不重要。问题最终是在其中一个执行程序上运行的代码中存在竞争条件 - 是否单独的 JVM - 阻止了任务完成。但是,您是对的:每个执行程序都有自己的 JVM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多