Spark任务停留在RUNNING

raogr8fs  于 2023-05-29  发布在  Apache
关注(0)|答案(1)|浏览(238)

我试图在我的Yarn集群上运行Spark ML管道(从JDBC加载一些数据,运行一些转换器,训练模型),但每次运行它时,我的执行程序中的一对夫妇-有时是一个,有时是3或4个-在运行他们的第一个任务集时卡住了(这将是3个任务的3个核心),而其余的正常运行,一次检查3个。
在UI中,你会看到这样的东西:

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

  • 当我设置我的执行器使用一个核心,每个spark.executor.cores(即一次运行1个任务),则不会出现问题;
  • 卡住的执行程序似乎总是那些为了运行任务而不得不把一些分区混洗到它们上面的执行程序;
  • 被卡住的任务最终会被另一个示例成功地推测性地执行;
  • 偶尔,一个任务会卡在一个执行器中,否则是正常的,其他2个核心将继续工作正常,但是;
  • 卡住的执行器示例看起来一切正常:CPU在~ 100%,有足够的内存备用,JVM进程是活跃的,Spark或Yarn都没有记录任何异常,它们仍然可以从驱动程序接收指令,例如“放弃这个任务,其他人已经推测性地执行了它”-尽管,出于某种原因,它们 * 没有放弃它 *;
  • 那些执行人从来没有被司机杀死过,所以我想他们一直把他们的心跳发送得很好;

任何想法,以什么可能导致这一点或我应该尝试什么?

qoefvg9y

qoefvg9y1#

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

想明白了为了子孙后代:使用了一个线程不安全的数据结构(一个可变的HashMap)。由于同一台机器上的执行程序共享一个JVM,这会导致数据竞争,从而锁定单独的线程/任务。
结论是:当您使用spark.executor.cores > 1时(您可能应该这样做),请确保您的代码是线程安全的。

相关问题