2012-01-06 7 views
22

I mają następujące zapytanie ula:
Ul nie może ręcznie ustawić liczbę reduktorów

select count(distinct id) as total from mytable; 

automatycznie ikra:
1408 Elementy odwzorowujące
1 redukcyjna

trzeba ręcznie ustawić szereg reduktorów i próbowałem następujące:

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

, ale żadne z tych ustawień nie wydają się być honorowane. Zapytanie trwa wiecznie. Czy istnieje sposób ręcznego ustawienia reduktorów lub może przepisać zapytanie, aby uzyskać więcej redukcji? Dzięki!

+0

Ile węzłów używasz? – Tudor

+0

Nie ma znaczenia, że ​​Tudor, nawet gdyby zmniejszył szczelinę, nadal mógł mieć więcej reduktorów. –

+0

Wątpię, czy to prawda, ponieważ masz 1400 mapperów, ale czy działasz w trybie lokalnym? Jeśli tak, to utrzymam twój reduktor na poziomie 1, jak sądzę. –

Odpowiedz

39

zapytanie do pisania w ulu tak:

SELECT COUNT(DISTINCT id) .... 

zawsze będzie prowadzić przy użyciu tylko jeden reduktor. Powinieneś:

  1. użycie tego polecenia, aby ustawić żądaną liczbę reduktorów:

    zestaw mapred.reduce.tasks = 50

  2. przepisywania zapytań w następujący sposób:

WYBIERZ LICZBĘ (*) Z (WYBIERZ NUMER DISTYNKU OD ...) t;

Spowoduje to 2 mapy + zmniejszyć zadania zamiast jednego, ale wzrost wydajności będzie znaczny.

+0

fajne. w jaki sposób kompilator hive nie robi automatycznie tej optymalizacji (zamieniając się w 2 zadania MR)? – ihadanny

+0

Istnieją sytuacje, w których przekształcenie tego w 2 zadania MR nie jest optymalizacją. Na przykład, jeśli identyfikator jest już bliski unikatowi, a tabela jest przechowywana w formacie pliku kolumnowym (jak RCFILE), wówczas 1 zadanie MR byłoby z pewnością lepsze. Ponieważ takie sytuacje nie są dziwaczne, wyobrażam sobie, że właśnie dlatego nikt nie zbudował tej optymalizacji w Hive. –

1

Można ustawić liczbę reduktorów spawnowanych na węzeł w pliku konfiguracyjnym conf/mapred-site.xml. Zobacz tutaj: http://hadoop.apache.org/common/docs/r0.20.0/cluster_setup.html.

W szczególności, należy ustawić tę właściwość:

mapred.tasktracker.reduce.tasks.maximum 
+0

dotyczy wszystkich zadań.Jeśli chcesz ustawić dla konkretnego zapytania, myślę, że lepiej jest użyć 'set mapred.reduce.tasks' –

9

Ilość reduktorów zależy również od wielkości pliku wejściowego

domyślnie jest to 1 GB (1000000000 bajtów). Można to zmienić poprzez ustawienie hive.exec.reducers.bytes.per.reducer własności:

  1. albo zmieniając wyodrębnienie site.xml

    <property> 
        <name>hive.exec.reducers.bytes.per.reducer</name> 
        <value>1000000</value> 
    </property> 
    
  2. lub stosując zestaw

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

Powiązane problemy