2015-05-04 10 views
5

Mam tysiące skompresowanych plików o rozmiarze 2 GB w HDFS. Używam iskry do przetwarzania tych plików. Używam metody Spark textFile() do załadowania plików z HDFS. Moje pytanie brzmi: jak mogę podzielić dane na partycje, aby móc przetwarzać każdy plik równolegle. Obecnie każdy plik .gz jest przetwarzany w jednym zadaniu. Jeśli więc przetworzę 1000 plików, wykonywanych jest tylko 1000 zadań. Rozumiem, że skompresowane pliki nie mogą zostać podzielone. Ale czy jest jakaś inna metoda, dzięki której mogę szybciej wykonywać swoją pracę?Jak podzielić na partycje skompresowany plik w Apache Spark?

Odpowiedz

3

Możesz użyć rdd.repartition(#partitions) po załadowaniu pliku. To wiąże się z kosztem shuffle, więc musisz ocenić, czy wzrost wydajności w równoległości obejmuje ten początkowy koszt losowy.

Innym sposobem byłoby wykonanie dowolnych transformacji (mapa, filtr, ...) na początkowej partycji i użycie dowolnego etapu shuffle już istniejącego w potoku do ponownego podziału na RDD. na przykład

rdd.map().filter().flatMap().sortBy(f, numPartitions=new#ofpartitions) 
+2

to właśnie robię obecnie, ale przy ładowaniu danych nie jest to równoznaczne. Dla jednego pliku wykonuje tylko jedno zadanie podczas ładowania. Zastanawiam się, czy możemy zrównoleglić podczas ładowania danych. – None

+1

@hadooped nie, że znam. Mam nadzieję, że ktoś wie lepiej. – maasg