Sparkクラスターをyarn-client
として使用して、いくつかのビジネスを計算しますが、タスクの実行時間が長すぎる場合があります。
タイムアウトは設定していませんが、デフォルトのタイムアウトa sparkタスクはここではそれほど長くはありません(1.7h)。
誰もが私にこの問題を回避するための理想を与えます???
spark時間がかかりすぎると、タスクを強制終了する方法はありません。
しかし、私はこれを処理する方法を 投機 、
これは、1つ以上のタスクがステージでゆっくりと実行されている場合、それらが再起動されることを意味します。
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();
}
ここでの秘訣は、ワーカーノードに直接ログインしてプロセスを強制終了することです。通常、問題のあるプロセスは、top
、ps
、およびgrep
の組み合わせで見つけることができます。次に、kill pid
。