2017-04-05 3 views
1

J'ai un mélange de versions Spark (1.6, 2.0, 2.1) toutes déployées sur YARN (Hadoop 2.6.0/CDH 5.5). J'essaie de garantir qu'une certaine application ne sera jamais affamée de ressources sur notre cluster YARN, indépendamment de ce qui peut être exécuté ailleurs.Comment fonctionnent les pools de planificateur Spark lorsqu'ils s'exécutent sur YARN?

J'ai activé le service de lecture aléatoire et ai configuré Fair Scheduler Pools comme décrit dans les documents Spark. J'ai créé un bassin séparé pour l'application de haute priorité, je ne veux plus jamais être privé de ressources, et lui a donné une minShare des ressources:

<?xml version="1.0"?> 
<allocations> 
    <pool name="default"> 
    <schedulingMode>FAIR</schedulingMode> 
    <weight>1</weight> 
    <minShare>0</minShare> 
    </pool> 
    <pool name="high_priority"> 
    <schedulingMode>FAIR</schedulingMode> 
    <weight>1</weight> 
    <minShare>24</minShare> 
    </pool> 
</allocations> 

Quand je lance une application Spark sur notre cluster YARN, je peux voir que la piscines I configuré sont reconnus:

17/04/04 11:38:20 INFO scheduler.FairSchedulableBuilder: Created pool default, schedulingMode: FAIR, minShare: 0, weight: 1 
17/04/04 11:38:20 INFO scheduler.FairSchedulableBuilder: Created pool high_priority, schedulingMode: FAIR, minShare: 24, weight: 1 

Cependant, je ne vois pas que mon application utilise la nouvelle piscine high_priority, même si je suis en train spark.scheduler.pool dans mon appel à spark-submit. Cela signifie donc que lorsque le groupe est lié par l'activité régulière, ma demande de haute priorité ne reçoit pas les ressources dont il a besoin:

17/04/04 11:39:49 INFO cluster.YarnScheduler: Adding task set 0.0 with 1 tasks 
17/04/04 11:39:50 INFO scheduler.FairSchedulableBuilder: Added task set TaskSet_0 tasks to pool default 
17/04/04 11:39:50 INFO spark.ExecutorAllocationManager: Requesting 1 new executor because tasks are backlogged (new desired total will be 1) 
17/04/04 11:40:05 WARN cluster.YarnScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources 

Qu'est-ce que je manque ici? Mes collègues et moi avons essayé d'activer la préemption dans YARN, mais cela n'a rien fait. Et puis nous avons réalisé qu'il y a un concept dans YARN très similaire aux pools de planificateur Spark appelé YARN queues. Nous ne sommes donc pas sûrs si les deux concepts sont en conflit. Comment pouvons-nous faire fonctionner notre pool de haute priorité comme prévu? Existe-t-il une sorte de conflit entre les pools de planificateur Spark et les files d'attente YARN?

Répondre

2

Quelqu'un over on the spark-users list a clarifié quelque chose qui explique pourquoi je ne reçois pas ce que je pense: les piscines de planificateur Spark sont pour la gestion des ressources au sein une application, alors que les files d'attente sont YARN pour la gestion des ressources à travers applications. J'ai besoin de ce dernier et utilisais par erreur le premier.

Ceci est expliqué dans les documents Spark sous Job Scheduling. J'ai simplement été mordu par une lecture imprudente plus une confusion de "travail" dans le sens technique du mot Spark (ie actions dans une application Spark) et "travail" comme mes collègues et je l'utilise couramment pour désigner une application soumise au cluster .