Hive non in grado di impostare manualmente il numero di riduttori

Ho la seguente query hive:

select count(distinct id) as total from mytable; 

che genera automaticamente:
1408 mappatori
1 riduttore

Ho bisogno di impostare manualmente il numero di riduttori e ho provato quanto segue:

 set mapred.reduce.tasks=50 set hive.exec.reducers.max=50 

ma nessuna di queste impostazioni sembra essere onorato. La query impiega un’eternità per essere eseguita. C’è un modo per impostare manualmente i riduttori o forse riscrivere la query in modo che possa comportare più riduttori? Grazie!

scrivere query in hive come questo:

  SELECT COUNT(DISTINCT id) .... 

risulterà sempre nell’utilizzo di un solo riduttore. Dovresti:

  1. utilizzare questo comando per impostare il numero desiderato di riduttori:

    imposta mapred.reduce.tasks = 50

  2. riscrivi la query come segue:

SELECT COUNT (*) FROM (SELECT DISTINCT id FROM …) t;

Ciò si tradurrà in 2 mappe + ridurre i posti di lavoro anziché uno, ma il guadagno in termini di prestazioni sarà notevole.

Il numero di riduttori dipende anche dalla dimensione del file di input

Per impostazione predefinita è 1 GB (1000000000 byte). È ansible cambiarlo impostando la proprietà hive.exec.reducers.bytes.per.reducer:

  1. o cambiando hive-site.xml

      hive.exec.reducers.bytes.per.reducer 1000000  
  2. o usando set

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

È ansible impostare il numero di riduttori generati per nodo nel file conf/mapred-site.xml config. Vedi qui: http://hadoop.apache.org/common/docs/r0.20.0/cluster_setup.html .

In particolare, è necessario impostare questa proprietà:

 mapred.tasktracker.reduce.tasks.maximum 

Il mapper dipende totalmente dal numero di file, ovvero dalla dimensione del file, che possiamo chiamare come split di input. Split rileva, ma la divisione logica dei dati. Es: la dimensione del mio file è 150 MB e il mio blocco predefinito HDFS è 128 MB. Creerà due mezzi divisi in due blocchi. Due mapper verranno assegnati per questo lavoro.

Imp Nota: Supponiamo che io abbia specificato che la dimensione dello split è 50MB, quindi inizierà 3 Mapper perché dipende totalmente dal numero di split.

Imp Nota: se si prevedono 10 TB di dati di input e un blocco di 128 MB , si ottengono 82.000 mappe , a meno che Configuration.set (MRJobConfig.NUM_MAPS, int) (che fornisce solo un suggerimento al framework) sia utilizzato per impostalo ancora più in alto.

Nota: se non è stata specificata la dimensione divisa, la dimensione del blocco hdf verrà considerata come dimensione parziale.

Il riduttore ha 3 fasi primarie: shuffle, sort e riduci .

Comando:

1] Imposta attività mappa: -D mapred.map.tasks = 4
2] Imposta Riduci attività: -D mapred.reduce.tasks = 2