Scal pliki wyjściowe po fazie redukcji

W mapreduce każde zadanie reduce zapisuje swoje wyjście do pliku o nazwie part-r-nnnnn Gdzie nnnnn jest identyfikatorem partycji powiązanym z zadaniem reduce. Czy map/reduce Scala te pliki? Jeśli tak, to w jaki sposób?

Author: David Ongaro, 2011-04-18

10 answers

Zamiast scalać pliki samodzielnie, możesz delegować całe Scalanie plików redukuj, wywołując:

hadoop fs -getmerge /output/dir/on/hdfs/ /desired/local/output/file.txt

Uwaga łączy pliki HDFS lokalnie. Upewnij się, że masz wystarczająco dużo miejsca na dysku przed uruchomieniem

 116
Author: diliop,
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
2018-03-01 06:28:59

Nie, Te pliki nie są łączone przez Hadoop. Liczba otrzymywanych plików jest taka sama jak liczba zadań redukcji.

Jeśli potrzebujesz tego jako danych wejściowych do następnego zadania, nie martw się o osobne pliki. Po prostu określ cały katalog jako dane wejściowe dla następnego zadania.

Jeśli potrzebujesz danych poza klastrem, Zwykle scalam je na końcu odbiorczym podczas ściągania danych z klastra.

Czyli coś takiego:

hadoop fs -cat /some/where/on/hdfs/job-output/part-r-* > TheCombinedResultOfTheJob.txt
 26
Author: Niels Basjes,
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
2011-04-18 10:06:33

To funkcja, której możesz użyć do scalania plików w HDFS

public boolean getMergeInHdfs(String src, String dest) throws IllegalArgumentException, IOException {
    FileSystem fs = FileSystem.get(config);
    Path srcPath = new Path(src);
    Path dstPath = new Path(dest);

    // Check if the path already exists
    if (!(fs.exists(srcPath))) {
        logger.info("Path " + src + " does not exists!");
        return false;
    }

    if (!(fs.exists(dstPath))) {
        logger.info("Path " + dest + " does not exists!");
        return false;
    }
    return FileUtil.copyMerge(fs, srcPath, fs, dstPath, false, config, null);
}
 8
Author: Mervyn,
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-07-02 15:29:21

Tylko dla plików tekstowych i HDFS jako źródła i miejsca docelowego, użyj poniższego polecenia:

hadoop fs -cat /input_hdfs_dir/* | hadoop fs -put - /output_hdfs_file

To połączy wszystkie pliki w input_hdfs_dir i zapisze wyjście z powrotem do HDFS w output_hdfs_file. Należy pamiętać, że wszystkie dane zostaną przeniesione z powrotem do systemu lokalnego, a następnie ponownie przesłane do systemu hdfs, chociaż nie są tworzone żadne pliki tymczasowe i dzieje się to w locie za pomocą Unix pe.

Również nie będzie to działać z plikami nietekstowymi, takimi jak Avro, ORC itp.

Dla pliki binarne, możesz zrobić coś takiego (jeśli masz tabele Hive odwzorowane w katalogach):

insert overwrite table tbl select * from tbl

W zależności od konfiguracji, może to również tworzyć więcej niż pliki. Aby utworzyć pojedynczy plik, Ustaw liczbę reduktorów na 1 jawnie używając mapreduce.job.reduces=1 lub ustaw właściwość hive jako hive.merge.mapredfiles=true.

 6
Author: Gaurav Kumar,
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-09-16 15:46:27

Można uruchomić dodatkowe zadanie map/reduce, gdzie map i reduce nie zmieniają danych, a partycjoner przypisuje wszystkie dane do jednego reduktora.

 3
Author: adamax,
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
2011-04-18 09:19:34

Pliki part-r-NNNN są generowane po fazie redukcji oznaczonej przez " R " pomiędzy. Faktem jest, że jeśli masz uruchomiony jeden reduktor, będziesz miał plik wyjściowy, taki jak part-r-00000. Jeśli liczba reduktorów wynosi 2, będziesz miał część-r-00000 i część-r-00001 i tak dalej. Jeśli plik wyjściowy jest zbyt duży, aby zmieścić się w pamięci maszyny, ponieważ Framework hadoop został zaprojektowany do pracy na Commodity Machines , to plik zostanie podzielony. Jak na MRv1, ty masz limit 20 reduktorów do pracy nad swoją logiką. Możesz mieć więcej, ale to samo musi być dostosowane w plikach konfiguracyjnych mapred-site.xml . Mówiąc o swoim pytaniu; możesz użyć getmerge lub możesz ustawić liczbę reduktorów na 1, osadzając następującą instrukcję w kodzie sterownika

job.setNumReduceTasks(1);
Mam nadzieję, że to odpowie na twoje pytanie.
 3
Author: Aniruddha Sinha,
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-10-27 05:47:23

Oprócz mojej poprzedniej odpowiedzi mam dla Ciebie jeszcze jedną odpowiedź, którą próbowałem kilka minut temu. Możesz użyć CustomOutputFormat który wygląda jak kod podany poniżej

public class VictorOutputFormat extends FileOutputFormat<StudentKey,PassValue> {

    @Override
    public RecordWriter<StudentKey,PassValue> getRecordWriter(
            TaskAttemptContext tac) throws IOException, InterruptedException {
        //step 1: GET THE CURRENT PATH
        Path currPath=FileOutputFormat.getOutputPath(tac);

        //Create the full path
        Path fullPath=new Path(currPath,"Aniruddha.txt");

        //create the file in the file system
        FileSystem fs=currPath.getFileSystem(tac.getConfiguration());
        FSDataOutputStream fileOut=fs.create(fullPath,tac);
        return new VictorRecordWriter(fileOut);
    }

}
Spójrz tylko na czwartą linię od ostatniej. Użyłem własnej nazwy jako nazwy pliku wyjściowego i przetestowałem program z 15 reduktorami. Plik pozostaje bez zmian. Tak więc uzyskanie pojedynczego pliku wyjściowego zamiast dwóch lub więcej jest jeszcze możliwe, aby uzyskać bardzo wyraźny rozmiar wyjścia plik nie może przekraczać wielkości pamięci podstawowej, tzn. plik wyjściowy musi zmieścić się w pamięci maszyny Towarowej, w przeciwnym razie może wystąpić problem z podziałem pliku wyjściowego. Dzięki!!
 1
Author: Aniruddha Sinha,
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-10-27 10:20:59

Dlaczego nie użyć skryptu świni takiego jak ten do scalania plików partycji:

stuff = load "/path/to/dir/*"

store stuff into "/path/to/mergedir"
 0
Author: Ian,
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-12-21 04:03:23

Jeśli pliki mają nagłówek, możesz się go pozbyć, wykonując to:

hadoop fs -cat /path/to/hdfs/job-output/part-* | grep -v "header" > output.csv

Następnie dodaj nagłówek ręcznie dla wyjścia.csv

 0
Author: Masih,
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
2017-01-18 18:12:16

. Czy map/reduce łączy te pliki?

Nie. Nie łączy się.

Możesz użyć IdentityReducer , aby osiągnąć swój cel.

Nie wykonuje redukcji, zapisując wszystkie wartości wejściowe bezpośrednio na wyjście.

public void reduce(K key,
                   Iterator<V> values,
                   OutputCollector<K,V> output,
                   Reporter reporter)
            throws IOException

Zapisuje wszystkie klucze i wartości bezpośrednio do wyjścia.

Zobacz podobne posty SE:

Hadoop: różnica między reduktorem 0 a reduktorem tożsamości?

 0
Author: Ravindra babu,
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
2017-05-23 12:26:15