如何在纱线客户端处理运行时间过长的任务(与工作中的其他人相比)?

时间:2015-08-04 02:32:02

标签: apache-spark yarn parquet

我们使用Spark集群作为yarn-client计算多个业务,但有时我们的任务运行时间太长:

enter image description here

我们没有设置超时但我认为默认超时这个火花任务不会太长(1.7h)。

任何人都有理由解决这个问题???

2 个答案:

答案 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.htmlhttp://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节点并终止进程。通常,您可以通过toppsgrep的组合找到违规流程。然后只需kill pid