web-dev-qa-db-ja.com

ヤーンクライアントで(他のジョブと比較して)実行時間が長すぎるタスクに対処するにはどうすればよいですか?

Sparkクラスターをyarn-clientとして使用して、いくつかのビジネスを計算しますが、タスクの実行時間が長すぎる場合があります。

enter image description here

タイムアウトは設定していませんが、デフォルトのタイムアウトa sparkタスクはここではそれほど長くはありません(1.7h)。

誰もが私にこの問題を回避するための理想を与えます???

13
tnk_peka

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();
} 
20
zengr

ここでの秘訣は、ワーカーノードに直接ログインしてプロセスを強制終了することです。通常、問題のあるプロセスは、topps、およびgrepの組み合わせで見つけることができます。次に、kill pid

1
rsmith54