2014-10-13 4 views
7

Beim Versuch, ein sehr großes SchemaRDD im Parkettformat auf S3 zu speichern, sind einige Probleme aufgetreten. Ich habe bereits spezielle Fragen für diese Probleme gestellt, aber das ist es, was ich wirklich tun muss. Der Code sollte so etwas wie dieseSpeichern eines >> 25T SchemaRDD im Parkett-Format unter S3

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

ich auf Probleme stoßen aussehen, wenn ich mehr als etwa 2000 Partitionen oder wenn es Partition größer als 5G. Dies legt eine Obergrenze für die maximale Größe SchemaRDD, die ich auf diese Weise verarbeiten kann. Das praktische Limit liegt näher bei 1T, da die Größe der Partitionen sehr unterschiedlich ist und Sie nur 1 5G-Partition benötigen, damit der Prozess fehlschlägt.

Fragen mit den spezifischen Problemen zu tun mir begegnet sind

Diese Fragen, ob es irgendwelche Lösungen für das Hauptziel sind zu sehen ist, dass nicht unbedingt die oben genannten Probleme direkt zu lösen.


Dinge zu destillieren dort unten zwei Probleme sind

  • eine einzelne Scherbe größer als 5G Schreiben in S # ausfällt. AFAIK dies ein eingebautes Limit von s3n:// Eimer. Es sollte für s3:// Buckets möglich sein, aber scheint nicht von Spark und hadoop distcp aus dem lokalen HDFS funktionieren, kann es auch nicht tun.

  • Schreiben der Zusammenfassungsdatei neigt dazu, fehlzuschlagen, sobald es 1000er von Shards gibt. Es scheint mehrere Probleme damit zu geben. Schreiben direkt in S3 erzeugt den Fehler in der oben verlinkten Frage. Das Schreiben direkt in das lokale HDFS erzeugt einen OOM-Fehler selbst bei einem r3.8xlarge (244G RAM), wenn dort etwa 5000 Shards vorhanden sind. Dies scheint unabhängig vom tatsächlichen Datenvolumen zu sein. Die Zusammenfassungsdatei scheint für eine effiziente Abfrage wesentlich zu sein.

Zusammen begrenzen diese Probleme Parkett-Tabellen auf S3 zu 25T. In der Praxis ist es tatsächlich wesentlich weniger, da die Shard-Größen innerhalb einer RDD stark variieren können und die 5G-Grenze für den größten Shard gilt.

Wie kann ich eine >> 25T RDD als Parkett zu S3 schreiben?

Ich benutze Spark-1.1.0.

Antwort

3

Von AWS S3 Dokumentation:

Das Gesamtvolumen der Daten und die Anzahl der Objekte, die Sie speichern können, unbegrenzt. Einzelne Amazon S3-Objekte können eine Größe von 1 Byte bis 5 Terabyte haben. Das größte Objekt, das in einem einzelnen PUT hochgeladen werden kann, ist 5 Gigabyte. Bei Objekten, die größer als 100 Megabyte sind, sollten Kunden die Verwendung der Multipart-Upload-Funktion in Erwägung ziehen.

Ein Weg, um dies zu realisieren:

  • Attache ein EBS-Datenträger an Ihrem System, das Format es.
  • Kopieren Sie die Dateien auf das "lokale" EBS-Volume.
  • Snapshot das Volumen, es geht automatisch zu Ihrem S3.

Es gibt auch eine kleinere Belastung für Ihre Instanz.

Um auf diese Daten zugreifen zu können, müssen Sie den Snapshot als EBS an eine Instanz anhängen.

Verwandte Themen