J'ai la requête Hive suivante:
select count(distinct id) as total from mytable;
qui génère automatiquement:
1408 Mappeurs
1 Réducteur
Je dois définir manuellement le nombre de réducteurs et j'ai essayé ce qui suit:
set mapred.reduce.tasks=50
set Hive.exec.reducers.max=50
mais aucun de ces paramètres ne semble être respecté. La requête prend une éternité pour s'exécuter. Existe-t-il un moyen de définir manuellement les réducteurs ou peut-être de réécrire la requête afin de générer davantage de réducteurs? Merci!
écrire une requête dans Hive comme ceci:
SELECT COUNT(DISTINCT id) ....
entraînera toujours l'utilisation d'un seul réducteur. Vous devriez:
utilisez cette commande pour définir le nombre souhaité de réducteurs:
définir mapred.reduce.tasks = 50
réécrire la requête comme suit:
SELECT COUNT (*) FROM (SELECT DISTINCT id FROM ...) t;
Cela se traduira par 2 cartes + réduira les tâches au lieu d'une, mais le gain de performances sera substantiel.
Le nombre de réducteurs dépend également de la taille du fichier d'entrée
Par défaut, il est de 1 Go (1000000000 octets). Vous pouvez changer cela en définissant la propriété Hive.exec.reducers.bytes.per.reducer:
soit en changeant Hive-site.xml
<property>
<name>Hive.exec.reducers.bytes.per.reducer</name>
<value>1000000</value>
</property>
ou en utilisant l'ensemble
$ Hive -e "set Hive.exec.reducers.bytes.per.reducer=1000000"
Vous pouvez définir le nombre de réducteurs générés par nœud dans le conf/mapred-site.xml
fichier de configuration. Voir ici: http://hadoop.Apache.org/common/docs/r0.20.0/cluster_setup.html .
En particulier, vous devez définir cette propriété:
mapred.tasktracker.reduce.tasks.maximum
Mapper dépend entièrement du nombre de fichiers, c'est-à-dire de la taille du fichier, nous pouvons l'appeler comme fractionnement d'entrée. Le fractionnement est à noter mais le fractionnement logique des données. Ex: ma taille de fichier est de 150 Mo et mon bloc HDFS par défaut est de 128 Mo. Cela créera deux divisions, deux blocs. Deux mappeurs seront affectés à ce travail.
Imp Note: Supposons que j'ai spécifié que la taille de division est de 50 Mo. Il démarrera alors 3 Mapper car cela dépend totalement du nombre de divisions.
Imp Note: si vous vous attendez à 10 To de données d'entrée et avez une taille de bloc de 128 Mo, vous vous retrouverez avec 82 000 cartes, sauf si Configuration.set (MRJobConfig.NUM_MAPS, int) (qui ne fournit qu'un indice au framework) est utilisé pour le définir encore plus haut.
Remarque: Si nous n'avons pas spécifié la taille de fractionnement, il prendra la taille de bloc hdfs par défaut comme taille de fractionnement.
Réducteur a 3 phases principales: mélangez, triez et réduisez.
Commande:
1] Définir la tâche de carte: - D mapred.map.tasks = 4
2] Définir la tâche de réduction: - D mapred.reduce.tasks = 2