Spark + EMR utilisant le paramètre "MaximResourceAllocation" d'Amazon n'utilise pas tous les cœurs / vcores
Je suis à court d'un système de DME cluster (version dme-4.2.0) pour Allumage à l'aide de l'Amazonie spécifiques maximizeResourceAllocation
drapeau comme documenté ici. Selon ces documents, "cette option calcule le maximum de calcul et de mémoire de ressources disponibles pour un exécuteur testamentaire sur un nœud dans le noyau du groupe de nœuds et de définir le correspondant de l'étincelle-paramètres par défaut avec cette information".
Je suis l'exécution du cluster à l'aide de m3.2xlarge cas pour les nœuds de travail. Je suis à l'aide d'un seul m3.xlarge pour les FILS de maître - la plus petite m3 exemple je peux l'obtenir pour fonctionner sur, car il ne fait pas beaucoup.
La situation est ceci: Quand je lance une Étincelle d'emploi, le nombre de demandes de cœurs pour chaque exécuteur testamentaire est 8. (J'ai seulement eu cette après la configuration "yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalculator"
qui n'est pas dans la documentation, mais je m'égare). Ceci semble logique, parce que, selon ces docs une m3.2xlarge a 8 "vcpu". Cependant, sur les instances réelles eux-mêmes, dans /etc/hadoop/conf/yarn-site.xml
chaque nœud est configuré pour avoir yarn.nodemanager.resource.cpu-vcores
ensemble de 16
. Je voudrais (au jugé) pense que cela doit être dû à l'hyperthreading ou peut-être quelques autres matériel fanciness.
Donc, le problème, c'est que lorsque j'utilise maximizeResourceAllocation
j'obtiens le nombre de vcpu" que l'Amazone Instance de type a, qui ne semble être que la moitié du nombre de configuré "VCores" que le FIL est en cours d'exécution sur le nœud; en conséquence, l'exécuteur testamentaire est en utilisant seulement la moitié de l'effectif des ressources de calcul sur l'instance.
Est-ce un bug Amazon EMR? Autres personnes rencontrant le même problème? Est-il un autre magie sans-papiers configuration que je suis absent?
source d'informationauteur retnuH
Vous devez vous connecter pour publier un commentaire.
Bon, après beaucoup d'expérimentation, j'ai été en mesure d'éradiquer le problème. Je vais faire part de mes découvertes ici pour aider les gens à éviter la frustration dans l'avenir.
maximizeResourceAllocation
est définie, lorsque vous exécutez une Étincelle programme, il définit la propriétéspark.default.parallelism
être le nombre d'instance de carottes (ou "vcpu") pour tous les non-maîtrise des situations qui étaient dans le cluster au moment de la création. C'est probablement trop petite, même dans les cas normaux; j'ai entendu dire qu'il est recommandé de régler cette valeur à 4x le nombre de coeurs que vous devrez exécuter vos travaux. Cela permettra de vous assurer qu'il ya suffisamment de tâches à disposition au cours de n'importe quel stade donné de garder le Cpu occupé sur toutes les exécuteurs.spark.default.parallelism
paramètre lors de l'exécution, cela peut être un bon nombre de repartitionner.TL;DR
maximizeResourceAllocation
va faire presque tout pour vous correctement sauf que...spark.default.parallelism
à 4x nombre d'instance de coeurs que vous voulez le travail à exécuter sur chaque "étape" (DME parler)/"application" (en FIL de parler), c'est à dire jeu de tous les temps et...Avec ce paramètre, vous devez obtenir 1 exécuteur testamentaire sur chaque instance (à l'exception du maître), chacun avec 8 cœurs et environ 30 go de RAM.
Est l'Étincelle de l'INTERFACE utilisateur à http://:8088/ne pas montrer que l'allocation?
Je ne suis pas sûr que le réglage est vraiment beaucoup de valeur par rapport à l'autre, celui qui est mentionné sur cette page, "l'Activation de l'Allocation Dynamique des Exécutants". Que vais laisser Étincelle de gérer ses propres nombre d'instances pour un emploi, et si vous lancez une tâche avec 2 coeurs de CPU et 3G de RAM par exécuteur testamentaire, vous aurez un assez bon ratio CPU à la mémoire pour EMR instance tailles.
dans le DME de la version 3.x, ce maximizeResourceAllocation a été mis en œuvre avec une table de référence: https://github.com/awslabs/emr-bootstrap-actions/blob/master/spark/vcorereference.tsv
il utilisé par un script shell:
maximize-spark-default-config
dans le même dépôt, vous pouvez prendre un coup d'oeil la façon dont ils ont mis en œuvre cette.peut-être dans la nouvelle de DME à la version 4, cette table de référence a été quelque chose de mauvais... je crois que vous pouvez trouver tous ce AWS script dans votre instance EC2 de DME, doit être situé dans /usr/lib/spark ou /opt/aws ou quelque chose comme ça.
de toute façon, au moins, vous pouvez écrire votre propre
bootstrap action
scripts pour cette EMR 4, avec une bonne table de référence, similaire à la mise en œuvre des DME 3.xen outre, puisque nous allons utiliser STUPS de l'infrastructure, la peine de prendre un coup d'oeil la STUPS appareil pour Spark: https://github.com/zalando/spark-appliance
vous pouvez spécifier explicitement le nombre de cœurs par la mise senza paramètre
DefaultCores
lorsque vous déployez votre étincelle de clustercertains de mettre en évidence de cet appareil en comparaison des EMR sont:
en mesure de l'utiliser, même avec t2 type d'instance, auto-évolutive basée sur les rôles à l'instar d'autres STUPS appareil, etc.
et vous pouvez facilement déployer votre cluster en HA mode avec zookeeperdonc pas de SPOF sur le nœud maître, HA mode dans les EMR est actuellement pas encore possible, et je crois que les EMR est conçu principalement pour les "grandes grappes temporairement pour une analyse ad hoc des emplois", pas pour "cluster dédié qui est en permanence sur", de sorte HA mode ne sera pas possible dans près de loin, avec les EMR.