2015-10-01 4 views
0

Actuellement, je travaille sur le chargement de données dans un graphique Titan avec Hadoop (Titan version 0.5.4, Hadoop version 2.6.0). J'utilise un cluster Hadoop à serveur unique (pseudo-distribué), dans le but de s'étendre à un cluster complet avec plus de machines du même matériel. J'essaie de configurer Hadoop de manière à obtenir une utilisation complète. Jusqu'à présent, je pensais que j'avais fait une configuration correcte avec de bons paramètres de configuration, mais quand Hadoop est en train d'exécuter et charge des données dans le graphe Titan, je ne vois pas l'utilisation complète de tous les cœurs sur ma machine.Utilisation de tous les cœurs sur une seule machine Hadoop

La situation est la suivante. La machine que je utilise a les spécifications matérielles suivantes:

  • CPU: 32 cœurs
  • RAM: 256 Go
  • mémoire Swap: 32 Go
  • lecteurs: 8x128GB SSD, 4x2TB HDD

Les données que je charge dans un graphique Titan avec Hadoop ont les spécifications suivantes:

  • Taille totale: 848 Mo
  • Divisé en quatre fichiers (487 Mo, 142 Mo, 219 Mo et 1,6 Mo), contenant chacun des sommets d'un seul type, ainsi que toutes les propriétés de sommet et de sortie. Lors de la configuration du cluster Hadoop, j'ai essayé d'utiliser un certain raisonnement logique pour définir les paramètres de configuration de Hadoop selon leur (ce que je pense être le) paramètre optimal. Voir ce raisonnement ci-dessous. Ma machine a 32 cœurs, donc en théorie je pourrais diviser ma taille d'entrée en tronçons dont la taille est assez grande pour finir avec environ 32 tronçons. Donc, pour 848 Mo d'entrée, je pourrais définir dfs.block.size à 32 Mo, ce qui conduirait à environ (848 Mo/32 Mo ~) 27 morceaux.
  • Afin de m'assurer que chaque tâche de carte reçoit un chunck, je place la valeur de mapred.min.split.size à un peu moins que la taille de bloc, et mapred.max.split.size à un peu plus que la taille de bloc (par exemple 30MB et 34MB, respectivement).
  • La mémoire disponible nécessaire par tâche est un peu vague pour moi. Par exemple, je pourrais définir mapred.child.java.opts à une valeur de -Xmx1024m pour donner à chaque tâche (par exemple chaque mappeur/réducteur) 1 Go de mémoire. Étant donné que ma machine dispose de 256 Go de mémoire au total - en soustrayant certains d'entre eux à réserver à d'autres fins en me laissant environ 200 Go de mémoire - je pourrais se retrouver avec un total de 200 mappeurs/réducteurs (200 Go/1 Go). Ou, quand je donne 2 Go de mémoire à chaque tâche, je finirais avec un total de 100 mappeurs et réducteurs. La quantité de mémoire donnée à chaque tâche dépend également de la taille de l'entrée, je suppose. Quoi qu'il en soit, cela conduit à des valeurs de mapred.tasktracker.map/reduce.tasks.maximum d'environ 100, ce qui pourrait déjà être trop compte tenu du fait que je n'ai que 32 cœurs. Par conséquent, peut-être régler ce paramètre à 32 pour les deux map et reduce pourrait être mieux? Qu'est-ce que tu penses?

Après ces hypothèses, je me retrouve avec la configuration suivante.

hdfs-site.xml

<configuration> 
    <property> 
    <name>dfs.replication</name> 
    <value>1</value> 
    </property> 
    <property> 
    <name>dfs.block.size</name> 
    <value>33554432</value> 
    <description>Specifies the sizeof data blocks in which the input dataset is split.</description> 
    </property> 
</configuration> 

mapred site.xml

<configuration> 
    <property> 
    <name>mapreduce.framework.name</name> 
    <value>yarn</value> 
    <description>The runtime framework for executing MapReduce jobs. Can be one of local, classic or yarn.</description> 
    </property> 
    <property> 
    <name>mapred.child.java.opts</name> 
    <value>-Xmx2048m</value> 
    <description>Java opts for the task tracker child processes.</description> 
    </property> 
    <property> 
    <name>mapred.tasktracker.map.tasks.maximum</name> 
    <value>32</value> 
    <description>The maximum number of map tasks that will be run simultaneously by a tasktracker.</description> 
    </property> 
    <property> 
    <name>mapred.tasktracker.reduce.tasks.maximum</name> 
    <value>32</value> 
    <description>The maximum number of reduce tasks that will be run simultaneously by a tasktracker.</description> 
    </property> 
    <property> 
    <name>mapred.min.split.size</name> 
    <value>31457280</value> 
    <description>The minimum size chunk that map input should be split into.</description> 
    </property> 
    <property> 
    <name>mapred.max.split.size</name> 
    <value>35651584</value> 
    <description>The maximum size chunk that map input should be split into.</description> 
    </property> 
    <property> 
    <name>mapreduce.job.reduces</name> 
    <value>32</value> 
    <description>The default number of reducers to use.</description> 
    </property> 
    <property> 
    <name>mapreduce.job.maps</name> 
    <value>32</value> 
    <description>The default number of maps to use.</description> 
    </property> 
</configuration> 

fil-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.scheduler.minimum-allocation-mb</name> 
    <value>2048</value> 
    <description>The minimum allocation for every container request at the RM, in MBs.</description> 
    </property> 
</configuration> 

exécution Hadoop avec ces paramètres ne donne pas mon utilisation complète de base sur ma seule machine. Tous les cœurs ne sont pas occupés pendant toutes les phases de MapReduce. Pendant l'exécution de Hadoop, j'ai également jeté un coup d'œil sur le débit des E/S en utilisant la commande iostat (iostat -d -x 5 3 en me donnant trois rapports d'intervalles de 5 secondes). Un exemple d'un tel rapport est présenté ci-dessous.

Device:   rrqm/s wrqm/s  r/s  w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util 
sda    0.00  0.07 0.02 0.41  0.29  2.37 12.55  0.01 16.92 5.18 17.43 2.47 0.10 
sdb    0.07  2.86 4.90 10.17 585.19 1375.03 260.18  0.04 2.96 23.45 8.55 1.76 2.65 
sdc    0.08  2.83 4.89 10.12 585.48 1374.71 261.17  0.07 4.89 30.35 8.12 2.08 3.13 
sdd    0.07  2.83 4.89 10.10 584.79 1374.46 261.34  0.04 2.78 26.83 6.71 1.94 2.91 
sde    0.00  0.00 0.00 0.00  0.05  0.80 278.61  0.00 10.74 2.55 32.93 0.73 0.00 
sdf    0.00  0.00 0.00 0.00  0.05  0.80 283.72  0.00 10.30 1.94 33.09 0.68 0.00 
sdg    0.00  0.00 0.00 0.00  0.05  0.80 283.83  0.00 10.24 1.99 32.75 0.68 0.00 
sdh    0.00  0.00 0.00 0.00  0.05  0.80 284.13  0.00 10.29 1.96 32.99 0.69 0.00 
sdi    0.00  0.00 0.00 0.00  0.05  0.80 284.87  0.00 17.89 2.35 60.33 0.74 0.00 
sdj    0.00  0.00 0.00 0.00  0.05  0.80 284.05  0.00 10.30 2.01 32.96 0.68 0.00 
sdk    0.00  0.00 0.00 0.00  0.05  0.80 284.44  0.00 10.20 1.99 32.62 0.68 0.00 
sdl    0.00  0.00 0.00 0.00  0.05  0.80 284.21  0.00 10.50 2.00 33.71 0.69 0.00 
md127    0.00  0.00 0.04 0.01  0.36  6.38 279.84  0.00 0.00 0.00 0.00 0.00 0.00 
md0    0.00  0.00 14.92 36.53 1755.46 4124.20 228.57  0.00 0.00 0.00 0.00 0.00 0.00 

Je ne suis pas expert dans l'utilisation du disque, mais pourrait dire que ces valeurs que je suis IO-lié quelque part, par exemple sur des disques sdb, sbc ou sdd? Editer: peut-être une meilleure indication de l'utilisation du processeur et du débit des E/S peut-être donnée en utilisant la commande sar. Voici les résultats pour 5 rapports, 5 secondes APRT (sar -u 5 5):

11:07:45 AM  CPU  %user  %nice %system %iowait %steal  %idle 
11:07:50 AM  all  12.77  0.01  0.91  0.31  0.00  86.00 
11:07:55 AM  all  15.99  0.00  1.39  0.56  0.00  82.05 
11:08:00 AM  all  11.43  0.00  0.58  0.04  0.00  87.95 
11:08:05 AM  all  8.03  0.00  0.69  0.48  0.00  90.80 
11:08:10 AM  all  8.58  0.00  0.59  0.03  0.00  90.80 
Average:  all  11.36  0.00  0.83  0.28  0.00  87.53 

Merci d'avance pour toute réponse!

Répondre

0

Réglez ce paramètre dans le fil-site.xml à un certain nombre de cœurs votre machine a:

<property> 
<name>yarn.scheduler.maximum-allocation-vcores</name> 
<value>32</value> 
</property> 

Ensuite, exécutez pi de pot Hadoop exemples et observez avec la page Web de gestionnaire de ressources combien de cartographes sont en cours d'exécution en même temps

+0

Existe-t-il également une version console du gestionnaire de ressources que je peux utiliser, qui me donne la même information que la page Web? Je n'ai pas accès à une interface graphique. – Froodooo

+0

J'ai consulté l'API ResourceManager pendant l'exécution (par exemple 'http: // machine: 8088/ws/v1/cluster/metrics'), et découvert que la valeur de * containersPending * est supérieure à zéro, indiquant que les conteneurs attendent avant qu'ils puissent être exécutés, alors qu'il y a encore des cœurs inoccupés sur ma machine. Cela indique que tous les cœurs n'exécutent pas un travail simultanément. – Froodooo

+0

Je ne pense pas qu'il y en ait. Vous pouvez essayer d'utiliser un navigateur de console comme lynx ou vous connecter à partir d'une autre machine avec gui. Avez-vous exécuté l'exemple pi ou vous testez toujours avec votre propre application/données? Je demande parce que dans certains cas vos données personnalisées ne sont pas divisibles (il pourrait y avoir d'autres scénarios lorsque votre travail utiliserait moins de ressources alors disponibles). En testant avec pi à partir d'exemples, vous rejetteriez des problèmes avec votre application ou vos données. – facha