web-dev-qa-db-fra.com

Augmenter le nombre de mappeurs Hive dans Hadoop 2

J'ai créé une table HBase à partir de Hive et j'essaie de faire une agrégation simple dessus. Voici ma requête Hive:

from my_hbase_table 
select col1, count(1) 
group by col1;

La carte ne réduit le nombre de tâches générées que par 2 mappeurs et j'aimerais augmenter cela. Avec un travail de réduction de carte simple, je configurerais la mémoire de fil et de mappeur pour augmenter le nombre de mappeurs. J'ai essayé ce qui suit dans Hive mais cela n'a pas fonctionné:

set yarn.nodemanager.resource.cpu-vcores=16;
set yarn.nodemanager.resource.memory-mb=32768;
set mapreduce.map.cpu.vcores=1;
set mapreduce.map.memory.mb=2048;

REMARQUE:

  • Mon cluster de test n'a que 2 nœuds
  • La table HBase contient plus de 5 millions d'enregistrements
  • Les journaux de ruche montrent HiveInputFormat et un certain nombre de divisions = 2
8

Diviser le fichier moins que la valeur par défaut n'est pas une solution efficace. Le crachement est essentiellement utilisé lors du traitement d'un grand ensemble de données. La valeur par défaut est elle-même une petite taille, donc cela ne vaut pas la peine de la diviser à nouveau.

Je recommanderais de suivre la configuration avant votre requête.Vous pouvez l'appliquer en fonction de vos données d'entrée.

set Hive.merge.mapfiles=false;

set Hive.input.format=org.Apache.hadoop.Hive.ql.io.HiveInputFormat;

set mapred.map.tasks = XX;

Si vous souhaitez également attribuer un nombre de réducteur, vous pouvez utiliser la configuration ci-dessous

set mapred.reduce.tasks = XX;

Notez que sur Hadoop 2 (YARN), le mapred.map.tasks et mapred.reduce.tasks sont obsolètes et sont remplacés par d'autres variables:

mapred.map.tasks     -->    mapreduce.job.maps
mapred.reduce.tasks  -->    mapreduce.job.reduces

Veuillez vous référer au lien ci-dessous utile à ce sujet

http://answers.mapr.com/questions/5336/limit-mappers-and-reducers-for-specific-job.html

échec de l'augmentation des tâches du mappeur de ruche?

Comment les mappeurs sont affectés

Le nombre de mappeurs est déterminé par le nombre de divisions déterminées par InputFormat utilisé dans le travail MapReduce. Dans un InputFormat typique, il est directement proportionnel au nombre de fichiers et à la taille des fichiers.

supposons que votre configuration de bloc HDFS soit configurée pour 64 Mo (taille par défaut) et que vous avez des fichiers avec une taille de 100 Mo, alors il occupera 2 blocs, puis 2 mappeurs seront attribués en fonction des blocs

mais supposez que si vous avez 2 fichiers avec une taille de 30 Mo (chaque fichier), chaque fichier occupera un bloc et le mappeur sera assigend en fonction de cela.

Lorsque vous travaillez avec un grand nombre de petits fichiers, Hive utilise CombineHiveInputFormat par défaut. En termes de MapReduce, cela se traduit finalement par l'utilisation de CombineFileInputFormat qui crée des divisions virtuelles sur plusieurs fichiers, regroupées par nœud commun, rack lorsque cela est possible. La taille de la division combinée est déterminée par

mapred.max.split.size
or 
mapreduce.input.fileinputformat.split.maxsize ( in yarn/MR2);

Donc, si vous voulez avoir moins de divisions (moins de mappeur), vous devez définir ce paramètre plus haut.

Ce lien peut être utile pour en savoir plus.

Quelle est la taille par défaut que chaque mappeur Hadoop lira?

De plus, le nombre de mappeurs et de réducteurs dépend toujours des emplacements de mappeur et de réducteur disponibles de votre cluster.

18
Sandeep Singh

Réduisez la taille du fractionnement d'entrée par rapport à la valeur par défaut. Les mappeurs seront augmentés.

SET mapreduce.input.fileinputformat.split.maxsize;

4
Partha Kaushik

La division de la table HBase devrait permettre à votre travail d'utiliser automatiquement plus de mappeurs.

Puisque vous avez 2 divisions, chaque division est lue par un mappeur. Augmentez pas. des scissions.

1
Venkat