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?
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
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
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);
}
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
.
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.
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.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!!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"
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
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
Nie. Nie łączy się.. Czy map/reduce łączy te pliki?
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?
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