web-dev-qa-db-fra.com

Comment gérer des tâches trop longues (par rapport aux autres dans un travail) dans fil-client?

Nous utilisons un cluster Spark comme yarn-client pour calculer plusieurs entreprises, mais nous avons parfois une tâche trop longue à exécuter:

 enter image description here

Nous ne définissons pas de délai d'expiration, mais je pense que le délai d'expiration par défaut d'une tâche d'étincelle n'est pas trop long, comme ici (1,7h).

Quelqu'un me donne un idéal pour contourner ce problème ???

13
tnk_peka

Spark n'a aucun moyen de tuer ses tâches si cela prend trop de temps.

Mais j'ai trouvé un moyen de gérer cela en utilisant spéculation

Cela signifie que si une ou plusieurs tâches s'exécutent lentement dans une étape, elles seront relancées .

spark.speculation                  true
spark.speculation.multiplier       2
spark.speculation.quantile         0

Remarque: spark.speculation.quantile signifie que la "spéculation" démarrera à partir de votre première tâche. Alors utilisez-le avec prudence. Je l'utilise parce que certains emplois sont ralentis au fil du temps par GC. Je pense donc que vous devriez savoir quand utiliser ceci - ce n'est pas une solution miracle.

Quelques liens pertinents: http://Apache-spark-user-list.1001560.n3.nabble.com/Does-Spark-always-wait-for-stragglers-to-finish-running-td14298.html and http://mail-archives.us.Apache.org/mod_mbox/spark-user/201506.mbox/%3CCAPmMX=rOVQf7JtDu0uwnp1xNYNyz4xPgXYayKex42AZ_9Pvjug@mail.gmail.com%3E

Mise à jour

J'ai trouvé un correctif pour mon problème (peut ne pas fonctionner pour tout le monde). J'ai eu un tas de simulations en cours d'exécution par tâche, alors j'ai ajouté un délai d'attente autour de la course. Si une simulation prend plus de temps (en raison d'un décalage des données pour cette exécution spécifique), elle expire.

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");
}

Assurez-vous de gérer une interruption dans la boucle principale de la variable simulator, comme suit:

if(Thread.currentThread().isInterrupted()){
    throw new InterruptedException();
} 
20
zengr

L'astuce consiste à vous connecter directement au nœud de travail et à arrêter le processus. Généralement, vous pouvez trouver le processus incriminé avec une combinaison de top, ps et grep. Ensuite, faites juste un kill pid.

1
rsmith54