J'ai essayé d'exécuter un compte de mots simple en tant que travail MapReduce. Tout fonctionne bien lorsqu'il est exécuté localement (tout le travail est effectué sur le nœud de nom). Mais, lorsque j'essaie de l'exécuter sur un cluster à l'aide de YARN (en ajoutant mapreduce.framework.name
= yarn
à mapred-site.conf) le travail se bloque.
J'ai rencontré un problème similaire ici: les travaux MapReduce sont bloqués dans l'état Accepté
Sortie du travail:
*** START ***
15/12/25 17:52:50 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
15/12/25 17:52:51 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
15/12/25 17:52:51 INFO input.FileInputFormat: Total input paths to process : 5
15/12/25 17:52:52 INFO mapreduce.JobSubmitter: number of splits:5
15/12/25 17:52:52 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1451083949804_0001
15/12/25 17:52:53 INFO impl.YarnClientImpl: Submitted application application_1451083949804_0001
15/12/25 17:52:53 INFO mapreduce.Job: The url to track the job: http://hadoop-droplet:8088/proxy/application_1451083949804_0001/
15/12/25 17:52:53 INFO mapreduce.Job: Running job: job_1451083949804_0001
mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.job.tracker</name>
<value>localhost:54311</value>
</property>
<!--
<property>
<name>mapreduce.job.tracker.reserved.physicalmemory.mb</name>
<value></value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>3000</value>
<source>mapred-site.xml</source>
</property> -->
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.Apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!--
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>3000</value>
<source>yarn-site.xml</source>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>500</value>
</property>
<property>
<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
<value>3000</value>
</property>
-->
</configuration>
// J'ai les options commentées à gauche - elles ne résolvaient pas le problème
YarnApplicationState: ACCEPTÉ: attend que le conteneur AM soit alloué, lancé et enregistré auprès de RM.
Quel peut être le problème?
ÉDITER:
J'ai essayé cette configuration (commentée) sur des machines: NameNode (8 Go de RAM) + 2x DataNode (4 Go de RAM). J'obtiens le même effet: le travail se bloque sur l'état ACCEPTÉ.
EDIT2: modification de la configuration (merci @Manjunath Ballur) en:
yarn-site.xml:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-droplet</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop-droplet:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop-droplet:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop-droplet:8030</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop-droplet:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop-droplet:8088</value>
</property>
<property>
<description>Classpath for typical applications.</description>
<name>yarn.application.classpath</name>
<value>
$HADOOP_CONF_DIR,
$HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,
$HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,
$HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*,
$YARN_HOME/*,$YARN_HOME/lib/*
</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce.shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.Apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/data/1/yarn/local,/data/2/yarn/local,/data/3/yarn/local</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data/1/yarn/logs,/data/2/yarn/logs,/data/3/yarn/logs</value>
</property>
<property>
<description>Where to aggregate logs</description>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/var/log/hadoop-yarn/apps</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>390</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>390</value>
</property>
</configuration>
mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>50</value>
</property>
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value>-Xmx40m</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>50</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>50</value>
</property>
<property>
<name>mapreduce.map.Java.opts</name>
<value>-Xmx40m</value>
</property>
<property>
<name>mapreduce.reduce.Java.opts</name>
<value>-Xmx40m</value>
</property>
</configuration>
Ne fonctionne toujours pas. Informations supplémentaires: Je ne vois aucun nœud sur l'aperçu du cluster (problème similaire ici: Les nœuds esclaves ne sont pas dans Yarn ResourceManager )
Vous devez vérifier l'état des gestionnaires Node dans votre cluster. Si les nœuds NM manquent d'espace disque, RM les marquera comme "malsains" et ces NMs impossible d'allouer de nouveaux conteneurs.
1) Vérifiez les nœuds malsains: http://<active_RM>:8088/cluster/nodes/unhealthy
Si l'onglet "rapport de santé" indique "les répertoires locaux sont incorrects", cela signifie que vous devez nettoyer l'espace disque de ces nœuds.
2) Vérifiez le DFS dfs.data.dir
propriété dans hdfs-site.xml
. Il pointe l'emplacement sur le système de fichiers local où les données hdfs sont stockées.
3) Connectez-vous à ces machines et utilisez df -h
& hadoop fs - du -h
commandes pour mesurer l'espace occupé.
4) Vérifiez la corbeille hadoop et supprimez-la si elle vous bloque. hadoop fs -du -h /user/user_name/.Trash
et hadoop fs -rm -r /user/user_name/.Trash/*
Je pense que vos paramètres de mémoire sont incorrects.
Pour comprendre le réglage de la configuration de YARN, j'ai trouvé que c'était une très bonne source: http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cdh_ig_yarn_tuning. html
J'ai suivi les instructions données dans ce blog et j'ai pu faire fonctionner mon travail. Vous devez modifier vos paramètres proportionnellement à la mémoire physique que vous avez sur vos nœuds.
Les éléments clés à retenir sont:
mapreduce.map.memory.mb
et mapreduce.reduce.memory.mb
devrait être au moins yarn.scheduler.minimum-allocation-mb
mapreduce.map.Java.opts
et mapreduce.reduce.Java.opts
doit être d'environ "0,8 fois la valeur de" correspondant mapreduce.map.memory.mb
et mapreduce.reduce.memory.mb
configurations. (Dans mon cas, c'est 983 Mo ~ (0,8 * 1228 Mo))yarn.app.mapreduce.am.command-opts
doit être "0,8 fois la valeur de" yarn.app.mapreduce.am.resource.mb
Voici les paramètres que j'utilise et ils fonctionnent parfaitement pour moi:
yarn-site.xml:
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1228</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>9830</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>9830</value>
</property>
mapred-site.xml
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>1228</value>
</property>
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value>-Xmx983m</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>1228</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>1228</value>
</property>
<property>
<name>mapreduce.map.Java.opts</name>
<value>-Xmx983m</value>
</property>
<property>
<name>mapreduce.reduce.Java.opts</name>
<value>-Xmx983m</value>
</property>
Vous pouvez également vous référer à la réponse ici: Compréhension et réglage du conteneur de fils
Vous pouvez ajouter des paramètres vCore, si vous souhaitez que votre allocation de conteneur prenne également en compte le processeur. Mais, pour que cela fonctionne, vous devez utiliser CapacityScheduler
avec DominantResourceCalculator
. Voir la discussion à ce sujet ici: Comment les conteneurs sont-ils créés en fonction des vcores et de la mémoire dans MapReduce2?
Cela a résolu mon cas pour cette erreur:
<property>
<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
<value>100</value>
</property>
Vérifiez votre fichier d'hôtes sur les nœuds maître et esclave. J'ai eu exactement ce problème. Mon fichier d'hôtes ressemblait à ceci sur le nœud maître par exemple
127.0.0.0 localhost
127.0.1.1 master-virtualbox
192.168.15.101 master
Je l'ai changé comme ci-dessous
192.168.15.101 master master-virtualbox localhost
Donc ça a marché.
Ces lignes
<property>
<name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name>
<value>100</value>
</property>
dans le yarn-site.xml
a résolu mon problème car le nœud sera marqué comme malsain lorsque l'utilisation du disque est> = 95%. Solution principalement adaptée au mode pseudodistribué.
de toute façon cela fonctionne pour moi. merci beaucoup! @KaP
c'est mon fil-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>MacdeMacBook-Pro.local</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>${yarn.resourcemanager.hostname}:8088</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
c'est mon mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
Vous disposez de 512 Mo RAM sur chacune des instances et toutes vos configurations de mémoire dans yarn-site.xml et mapred-site.xml sont de 500 Mo à 3 Go. Vous ne pourrez pas exécuter n'importe quelle chose sur le cluster. Changez chaque chose en ~ 256 Mo.
Votre mapred-site.xml utilise également le framework to by yarn et vous avez une adresse de suivi des travaux qui n'est pas correcte. Vous devez avoir des paramètres liés au gestionnaire de ressources dans yarn-site.xml sur un cluster à plusieurs nœuds (y compris l'adresse Web resourcemanager). Sans cela, le cluster ne sait pas où se trouve votre cluster.
Vous devez revoir vos deux fichiers xml.
Vieille question, mais j'ai récemment rencontré le même problème et dans mon cas, cela était dû à la configuration manuelle du maître en local dans le code.
Veuillez rechercher conf.setMaster("local[*]")
et supprimez-le.
J'espère que ça aide.
La première chose est de vérifier les journaux du gestionnaire de ressources de fil. J'avais cherché sur Internet à propos de ce problème depuis très longtemps, mais personne ne m'a dit comment savoir ce qui se passait réellement. Il est si simple et simple de vérifier les journaux du gestionnaire de ressources de fil. Je ne comprends pas pourquoi les gens ignorent les journaux.
Pour moi, il y avait une erreur dans le journal
Caused by: org.Apache.hadoop.net.ConnectTimeoutException: 20000 millis timeout while waiting for channel to be ready for connect. ch : Java.nio.channels.SocketChannel[connection-pending remote=172.16.0.167/172.16.0.167:55622]
C'est parce que j'ai changé de réseau wifi sur mon lieu de travail, donc l'adresse IP de mon ordinateur a changé.