Apache spark Spark任务在运行时卡住了
我试图在我的纱线集群上运行Spark ML管道(从JDBC加载一些数据,运行一些转换器,训练一个模型),但每次我运行它时,我的两个执行器(有时是一个,有时是3个或4个)都无法运行第一个任务集(即3个核心中的每一个都有3个任务),而其余的都正常运行,一次检查3个 在UI中,您会看到如下内容: 到目前为止,我观察到了一些事情:Apache spark Spark任务在运行时卡住了,apache-spark,Apache Spark,我试图在我的纱线集群上运行Spark ML管道(从JDBC加载一些数据,运行一些转换器,训练一个模型),但每次我运行它时,我的两个执行器(有时是一个,有时是3个或4个)都无法运行第一个任务集(即3个核心中的每一个都有3个任务),而其余的都正常运行,一次检查3个 在UI中,您会看到如下内容: 到目前为止,我观察到了一些事情: 当我将我的执行器设置为使用1个core,每个core带有spark.executor.cores(即一次运行1个任务)时,不会出现问题 陷入困境的执行者似乎总是那些为了运
- 当我将我的执行器设置为使用1个core,每个core带有
(即一次运行1个任务)时,不会出现问题李>spark.executor.cores
- 陷入困境的执行者似乎总是那些为了运行任务而不得不对某些分区进行洗牌的执行者李>
- 被卡住的任务最终会被另一个实例成功地推测执行李>
- 偶尔,一个任务会卡在一个正常的执行器中,但是其他两个内核会保持正常工作李>
- 卡住的executor实例看起来一切正常:CPU在~100%,有足够的内存可用,JVM进程处于活动状态,Spark或Thread都不会记录任何异常情况,它们仍然可以接收来自驱动程序的指令,例如“放弃此任务,其他人已经推测地执行了它”——尽管出于某种原因,他们不会放弃它李>
- 那些遗嘱执行人从来没有被司机杀死过,所以我想他们一直保持着良好的心跳李>
关于可能导致这种情况的原因或我应该尝试什么,您有什么想法吗?TLDR:在您责怪Spark之前,请确保您的代码是线程安全的,并且没有争用条件 我明白了。对于后代:使用了线程不安全的数据结构(可变哈希映射)。由于同一台机器上的执行器共享一个JVM,这导致了数据竞争,从而锁定了单独的线程/任务
结果是:当您拥有
spark.executor.cores>1
(您可能应该这么做),确保您的代码是线程安全的。好奇-您是如何发现它是线程不安全的数据结构的?线程转储执行者?还没讲到那部分。我能够将它缩小到特定的模块,并且在多次被多线程代码咬到后面之后,我能够找到它。这是一个非常好的建议。感谢you@ktdrv您是否使用了spark本地模式?因为我很确定每个spark执行器在集群模式下都使用自己的JVM,我很确定这是胡说八道,但我认为在这种情况下,无论哪种方式,模式都不重要。问题最终在于,在其中一个执行器上运行的代码中存在一个竞态条件——不管是否是单独的JVM——这阻止了任务的完成。但是,您是对的:每个执行器都有自己的JVM。