答案 0 :(得分:20)
如果花费太长时间,火花无法杀死它的任务。
但我想出了一种使用speculation,
处理此问题的方法这意味着如果一个或多个任务在一个阶段中运行缓慢,那么它们 将重新启动。
spark.speculation true
spark.speculation.multiplier 2
spark.speculation.quantile 0
注意:spark.speculation.quantile
表示"猜测"将从你的第一个任务开始。所以要谨慎使用它。我正在使用它,因为随着时间的推移,一些工作因GC而变慢。所以我认为你应该知道何时使用它 - 它不是一颗银弹。
一些相关链接:http://apache-spark-user-list.1001560.n3.nabble.com/Does-Spark-always-wait-for-stragglers-to-finish-running-td14298.html和http://mail-archives.us.apache.org/mod_mbox/spark-user/201506.mbox/%3CCAPmMX=rOVQf7JtDu0uwnp1xNYNyz4xPgXYayKex42AZ_9Pvjug@mail.gmail.com%3E
<强>更新强>
我找到了解决问题的方法(可能不适用于所有人)。我有一堆模拟每个任务运行,所以我在运行中添加了超时。如果模拟花费的时间更长(由于特定运行的数据偏差),它将会超时。
ExecutorService executor = Executors.newCachedThreadPool();
Callable<SimResult> task = () -> simulator.run();
Future<SimResult> future = executor.submit(task);
try {
result = future.get(1, TimeUnit.MINUTES);
} catch (TimeoutException ex) {
future.cancel(true);
SPARKLOG.info("Task timed out");
}
确保在simulator
的主循环中处理中断,如:
if(Thread.currentThread().isInterrupted()){
throw new InterruptedException();
}
答案 1 :(得分:1)
这里的技巧是直接登录到worker节点并终止进程。通常,您可以通过top
,ps
和grep
的组合找到违规流程。然后只需kill pid
。