2014-10-13 10 views
7

Napotkałem wiele problemów podczas próby zapisania bardzo dużego SchemaRDD, jak w formacie Parquet na S3. Zadałem już szczegółowe pytania dotyczące tych problemów, ale tak naprawdę muszę to zrobić. Kod powinien wyglądać mniej więcej takZapisywanie >> 25T SchemaRDD w formacie Parkiet na S3

import org.apache.spark._ 
val sqlContext = sql.SQLContext(sc) 
val data = sqlContext.jsonFile("s3n://...", 10e-6) 
data.saveAsParquetFile("s3n://...") 

ja napotkasz problemy, jeśli mam więcej niż około 2000 partycje lub jeśli istnieje partycja większa niż 5G. Spowoduje to umieszczenie górnej granicy na maksymalnym rozmiarze SchemaRDD, który mogę przetwarzać w ten sposób. Prctical limit jest bliższy 1T, ponieważ rozmiary partycji różnią się znacznie i potrzebujesz tylko 1 5G partycji, aby proces się nie powiódł.

pytania dotyczące specyficznych problemów, jakie napotykają są

to pytanie jest, aby zobaczyć, czy są jakieś rozwiązania głównego bramką niekoniecznie wiąże się z rozwiązaniem jednego z powyższych problemów bezpośrednio.


destylować rzeczy tam są 2 problemy

  • pisania pojedynczej odłamek większy niż 5G do S # zawiedzie. AFAIK to wbudowany limit łyżek s3n://. To powinno być możliwe dla wiader s3://, ale nie działa ze Spark i hadoop distcp z lokalnego HDFS też tego nie potrafi.

  • Pisanie pliku podsumowania zwykle kończy się niepowodzeniem, gdy pojawi się tysiąc shardów. Wydaje się, że z tym wiąże się wiele problemów. Napisanie bezpośrednio do S3 powoduje błąd w powyższym linku. Napisanie bezpośrednio do lokalnego HDFS powoduje błąd OOM nawet na r3.8xlarge (244G RAM) raz, gdy istnieje około 5000 odłamków. Wydaje się to być niezależne od rzeczywistej objętości danych. Plik podsumowania wydaje się być niezbędny do wydajnego wysyłania zapytań.

Łącznie te problemy ograniczają parkiet na S3 do 25T. W praktyce jest to w rzeczywistości znacznie mniej, ponieważ rozmiary odłamków mogą się znacznie różnić w RDD, a limit 5G dotyczy największego odłamka.

Jak mogę napisać >> 25T RDD jako Parkiet do S3?

Używam Spark-1.1.0.

Odpowiedz

3

Od AWS dokumentacji S3:

Całkowita objętość danych i liczby obiektów, które można zapisać są nieograniczone. Poszczególne obiekty Amazon S3 mogą mieć rozmiar od 1 do 5 terabajtów. Największy obiekt, który można przesłać w jednym urządzeniu PUT, to 5 gigabajtów. W przypadku obiektów większych niż 100 megabajtów klienci powinni rozważyć użycie możliwości przesyłania wielu elementów.

Jednym ze sposobów, aby to obejść:

  • Attache woluminem EBS do systemu, format to.
  • Skopiuj pliki do "lokalnego" woluminu EBS.
  • Zrzut obrazu, automatycznie przechodzi do twojego S3.

Daje również mniejsze obciążenie instancji.

Aby uzyskać dostęp do tych danych, należy dołączyć migawkę do instancji jako EBS.

Powiązane problemy