Zmień rozmiar podziału pliku w Hadoop

Mam kilka małych plików w katalogu HDFS. Chociaż ilość plików jest stosunkowo niewielka, ilość czasu przetwarzania na plik jest ogromna . Oznacza to, że przetworzenie pliku 64mb, który jest domyślnym rozmiarem podzielonym dla TextInputFormat, zajęłoby nawet kilka godzin.

To, co muszę zrobić, to zmniejszyć rozmiar podziału , aby móc wykorzystać jeszcze więcej węzłów do pracy.

Więc pytanie brzmi, jak to możliwe, aby podzielić pliki powiedzmy 10kb? Czy muszę zaimplementować własne InputFormat i RecordReader, czy jest jakiś parametr do Ustawienia? Dzięki.

Author: Ahmedov, 2012-03-13

5 answers

Parametr mapred.max.split.size które można ustawić indywidualnie dla każdego zadania jest to, czego szukasz. Nie zmieniaj się dfs.block.size ponieważ jest to globalne dla HDFS i może prowadzić do problemów.

 32
Author: Brainlag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-17 20:25:36

Hadoop the Definitive Guide, page 203 " maksymalny rozmiar podziału domyślnie jest wartością maksymalną, która może być reprezentowana przez typ Java long. Ma efekt tylko wtedy, gdy jest mniejszy niż rozmiar bloku, zmuszając splity do bycia mniejszym niż blok . Wielkość podziału oblicza się według wzoru:

max(minimumSize, min(maximumSize, blockSize))

Domyślnie

minimumSize < blockSize < maximumSize

Więc wielkość podziału to blockSize

Na przykład,

Minimum Split Size 1
Maximum Split Size 32mb
Block Size  64mb
Split Size  32mb

Hadoop działa lepiej z małą liczbą dużych plików niż dużą liczbą małe pliki. Jednym z powodów jest to, że FileInputFormat generuje podziały w taki sposób, że każdy podział jest całością lub częścią pojedynczego pliku. Jeśli plik jest bardzo mały ("mały" oznacza znacznie mniejszy niż blok HDFS) i jest ich dużo, to każde zadanie mapy przetworzy bardzo mało danych wejściowych i będzie ich dużo (po jednym na plik), z których każde nakłada dodatkowe koszty księgowania. Porównaj plik 1GB podzielony na szesnaście bloków 64mb i 10.000 lub więcej plików 100kb. 10.000 plików użyj jednej mapy, a czas zadania może być dziesiątki lub setki razy wolniejszy niż równoważny z jednym plikiem wejściowym i 16 zadaniami mapowymi.


 21
Author: Ahmedov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-10 05:59:21

Oto fragment, który ilustruje poprawny sposób wykonania tego, co jest tu potrzebne bez magicznych łańcuchów konfiguracyjnych. Potrzebna stała jest zdefiniowana wewnątrz FileInputFormat. Rozmiar bloku może być pobrany w razie potrzeby z domyślnej stałej bloku HDFS, ale ma całkiem duże prawdopodobieństwo, że zostanie zdefiniowany przez użytkownika.

Tutaj po prostu dzielę maksymalny rozmiar dzielenia przez 2, jeśli został zdefiniowany.

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

// ....

final long DEFAULT_SPLIT_SIZE = 128 * 1024 * 1024;
final Configuration conf = ...

// We need to lower input block size by factor of two.
conf.setLong(
    FileInputFormat.SPLIT_MAXSIZE,
    conf.getLong(
        FileInputFormat.SPLIT_MAXSIZE, DEFAULT_SPLIT_SIZE) / 2);
 2
Author: Roman Nikitchenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-21 22:08:39

Napisać niestandardowy format wejściowy, który rozszerza combinefileinputformat [ma własną bazę plusów i minusów don dystrybucji hadoop]. który łączy dane wejściowe z wartością podaną w mapred.max.split.Rozmiar

 1
Author: Mahendran Ponnusamy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-16 16:16:03

"Hadoop: the Definitive Guide", str. 202:

Biorąc pod uwagę zestaw plików, w jaki sposób FileInputFormat przekształca je w splity? FileInputFormat dzieli tylko duże pliki. Tutaj "duży" oznacza większy niż blok HDFS. Rozmiar dzielony jest zwykle wielkością HDFS blok.

Więc powinieneś zmienić rozmiar bloku HDFS, ale to jest zły sposób. Może powinieneś spróbować przejrzeć architekturę swojej aplikacji MapReduce.

 -1
Author: Alexander Verbitsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-13 15:22:37