Durch die Nutzung von AWS re:Post stimmt du den AWS re:Post Nutzungsbedingungen

Wie kann ich Parquet-Dateien in Amazon EMR verketten?

Lesedauer: 2 Minute
0

Ich verwende s3DistCP (s3-dist-cp), um Dateien im Apache Parquet-Format mit den Optionen --groupBy und --targetSize zu verketten. Der s3-dist-cp-Job wird ohne Fehler abgeschlossen, aber die generierten Parquet-Dateien sind kaputt. Wenn ich versuche, die Parquet-Dateien in Anwendungen zu lesen, erhalte ich eine Fehlermeldung ähnlich der folgenden: „Erwartete n Werte im Spaltenblock bei /path/to/concatenated/parquet/file offset m, aber es wurden X-Werte auf y Seiten, die mit Dateioffset z enden, erhalten“

Kurzbeschreibung

S3DistCP unterstützt keine Verkettung von Parquet-Dateien. Verwenden Sie stattdessen PySpark.

Behebung

Sie können die Zieldateigröße in PySpark nicht angeben, aber Sie können die Anzahl der Partitionen angeben. Spark speichert jede Partition in einer separaten Ausgabedatei. Um die Anzahl der benötigten Partitionen abzuschätzen, dividieren Sie die Größe des Datensatzes durch die Größe der einzelnen Zieldatei.

  1. Erstellen Sie einen Amazon EMR-Cluster, auf dem Apache Spark installiert ist.

2.    Geben Sie an, wie viele Executoren Sie benötigen. Dies hängt von der Clusterkapazität und der Datensatzgröße ab. Bewährte Methoden für die erfolgreiche Speicherverwaltung für Apache Spark-Anwendungen auf Amazon EMR.

$  pyspark --num-executors number_of_executors

3.    Laden Sie die Parquet-Quelldateien in einen Spark DataFrame. Dies kann ein Amazon Simple Storage Service (Amazon S3) -Pfad oder ein HDFS-Pfad sein. Zum Beispiel:

df=sqlContext.read.parquet("s3://awsdoc-example-bucket/parquet-data/")

HDFS:

df=sqlContext.read.parquet("hdfs:///tmp/parquet-data/")

4.    Partitionieren Sie den DataFrame neu. Im folgenden Beispiel **ist **n die Anzahl der Partitionen.

df_output=df.coalesce(n)

5.    Speichern Sie den DataFrame im Ziel. Dies kann ein Amazon S3-Pfad oder ein HDFS-Pfad sein. Zum Beispiel:

df_output.write.parquet("URI:s3://awsdoc-example-bucket1/destination/")

HDFS:

df=sqlContext.write.parquet("hdfs:///tmp/destination/")

6.    Überprüfen Sie, wie viele Dateien sich jetzt im Zielverzeichnis befinden:

hadoop fs -ls "URI:s3://awsdoc-example-bucket1/destination/ | wc -l"

Die Gesamtzahl der Dateien sollte dem Wert von naus Schritt 4 plus eins entsprechen. Der Parquet-Output-Committer schreibt die zusätzliche Datei mit dem Namen**_SUCCESS**.


AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren