主要是出于教育目的,我试图让 Yarn + Spark 故意重新尝试我的 Spark 作业(即失败,并在另一个应用程序尝试中看到它被 yarn 重新安排)。
各种故障似乎会导致 Spark 作业重新运行;我知道我已经看过无数次了。 不过我在模拟它时遇到了麻烦。
我尝试强行停止流上下文并调用 System.exit(-1),但都没有达到预期的效果。
经过大量的尝试,我看到Spark + YARN不能很好地与退出代码一起使用(至少对于MapR 5.2.1的版本不是),但我认为它不是特定于MapR的。
有时 Spark 程序会抛出异常并死亡,它会向 YARN 报告成功(或者 YARN 以某种方式获得成功),因此没有重试。
执行 System.exit(-1) 不会提供任何更稳定的结果,有时即使重复相同的代码,它也可能是成功或失败。
有趣的是,获取对驱动程序主线程的引用并杀死它似乎确实会强制重新尝试;但这非常肮脏,需要在线程类上使用已弃用的函数。