web-dev-qa-db-fra.com

Quelle est la relation entre 'mapreduce.map.memory.mb' et 'mapred.map.child.Java.opts' dans Apache Hadoop YARN?

J'aimerais connaître la relation entre le mapreduce.map.memory.mb et mapred.map.child.Java.opts paramètres.

Est mapreduce.map.memory.mb> mapred.map.child.Java.opts?

Merci Kewal.

45
yedapoda

mapreduce.map.memory.mb est la limite maximale de mémoire que Hadoop autorise à allouer à un mappeur, en mégaoctets. La valeur par défaut est 512. Si cette limite est dépassée, Hadoop supprimera le mappeur avec une erreur comme celle-ci:

Le conteneur [pid = container_1406552545451_0009_01_000002, containerID = container_234132_0001_01_000001] est en cours d'exécution au-delà des limites de la mémoire physique. Utilisation actuelle: 569,1 Mo de mémoire physique utilisée de 512 Mo; 970,1 Mo de mémoire virtuelle de 1,0 Go utilisée. Tuer le conteneur.

Hadoop mapper est un processus Java et chaque processus Java a ses propres paramètres d’allocation de mémoire maximale configurés via mapred.map.child.Java. opts (ou mapreduce.map.Java.opts dans Hadoop 2+). Si le processus de mappeur est à court de mémoire vive, le mappeur lance une Java d'exceptions de mémoire:

Erreur: Java.lang.RuntimeException: Java.lang.OutOfMemoryError

Ainsi, les paramètres Hadoop et Java sont liés. Le paramètre Hadoop est davantage un paramètre d'application/de contrôle des ressources, et le Java est davantage une configuration de ressource une.

Les paramètres de segment de mémoire Java doivent être inférieurs à la limite de mémoire du conteneur Hadoop, car nous avons besoin de réserver de la mémoire pour le code Java. Il est généralement recommandé de réserver 20% de mémoire Ainsi, si les paramètres sont corrects, les tâches Hadoop basées sur Java ne doivent jamais être tuées par Hadoop, vous ne devriez donc jamais voir l'erreur "Killing container" comme ci-dessus.

Si vous rencontrez des erreurs de mémoire Java), vous devez augmenter les deux paramètres de mémoire.

66
user1234883

Les propriétés suivantes vous permettent de spécifier les options à transmettre aux machines virtuelles exécutant vos tâches. Ceux-ci peuvent être utilisés avec -Xmx pour contrôler tas disponible.

Hadoop 0.x, 1.x (deprecated)       Hadoop 2.x
-------------------------------    --------------------------
mapred.child.Java.opts            
mapred.map.child.Java.opts         mapreduce.map.Java.opts
mapred.reduce.child.Java.opts      mapreduce.reduce.Java.opts

Notez qu'il n'y a pas d'équivalent direct Hadoop 2 pour le premier d'entre eux; le conseil dans le code source est d'utiliser les deux autres. mapred.child.Java.opts est toujours pris en charge (mais est remplacé par les deux autres paramètres plus spécifiques, le cas échéant).

En complément de ceux-ci, les éléments suivants vous permettent de limiter mémoire totale (éventuellement virtuelle) disponible pour vos tâches - y compris les définitions de tas, de pile et de classe:

Hadoop 0.x, 1.x (deprecated)       Hadoop 2.x
-------------------------------    --------------------------
mapred.job.map.memory.mb           mapreduce.map.memory.mb
mapred.job.reduce.memory.mb        mapreduce.reduce.memory.mb

Je suggère de mettre -Xmx à 75% de la memory.mb valeurs.

Dans un cluster YARN, les travaux ne doivent pas utiliser plus de mémoire que la configuration côté serveur yarn.scheduler.maximum-allocation-mb ou ils seront tués.

Pour vérifier les valeurs par défaut et la priorité de celles-ci, voir JobConf et MRJobConfig dans le code source Hadoop.

Dépannage

N'oubliez pas que votre fichier mapred-site.xml peut fournir des valeurs par défaut pour ces paramètres. Cela peut être déroutant - par exemple si votre travail définit mapred.child.Java.opts par programme, cela n’aurait aucun effet si mapred-site.xml définit mapreduce.map.Java.opts ou mapreduce.reduce.Java.opts. Vous devrez plutôt définir ces propriétés dans votre travail pour remplacer le fichier mapred-site.xml. Consultez la page de configuration de votre travail (recherchez 'xmx') pour voir quelles valeurs ont été appliquées et d'où elles viennent.

mémoire ApplicationMaster

Dans un cluster YARN, vous pouvez utiliser les deux propriétés suivantes pour contrôler la quantité de mémoire disponible pour votre ApplicationMaster (pour stocker les détails des groupes d'entrées, l'état des tâches, etc.):

Hadoop 0.x, 1.x                    Hadoop 2.x
-------------------------------    --------------------------
                                   yarn.app.mapreduce.am.command-opts
                                   yarn.app.mapreduce.am.resource.mb

Encore une fois, vous pouvez définir -Xmx (dans l'ancien) à 75% des resource.mb valeur.

Autres configurations

Il existe de nombreuses autres configurations relatives aux limites de mémoire, dont certaines sont obsolètes - voir la classe JobConf. Un utile:

Hadoop 0.x, 1.x (deprecated)       Hadoop 2.x
-------------------------------    --------------------------
mapred.job.reduce.total.mem.bytes  mapreduce.reduce.memory.totalbytes

Définissez-le sur une valeur faible (10) pour forcer la lecture aléatoire sur le disque dans le cas où vous frappez un OutOfMemoryError à MapOutputCopier.shuffleInMemory.

53
Chris