web-dev-qa-db-fra.com

Ruche incapable de définir manuellement le nombre de réducteurs

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!

25
magicalo

écrire une requête dans Hive comme ceci:

 SELECT COUNT(DISTINCT id) ....

entraînera toujours l'utilisation d'un seul réducteur. Vous devriez:

  1. utilisez cette commande pour définir le nombre souhaité de réducteurs:

    définir mapred.reduce.tasks = 50

  2. 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.

43
wlk

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:

  1. soit en changeant Hive-site.xml

    <property>
       <name>Hive.exec.reducers.bytes.per.reducer</name>
       <value>1000000</value>
    </property>
    
  2. ou en utilisant l'ensemble

    $ Hive -e "set Hive.exec.reducers.bytes.per.reducer=1000000"

11
user1314742

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
1
Tudor

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

1
Viraj.Hadoop