Ich verwende den folgenden Scala-Code, um eine Textdatei in S3 mit Apache Spark in AWS EMR zu erstellen.Schreiben Sie eine Datei in S3 mit Spark on EMR
def createS3OutputFile() {
val conf = new SparkConf().setAppName("Spark Pi")
val spark = new SparkContext(conf)
// use s3n !
val outputFileUri = s"s3n://$s3Bucket/emr-output/test-3.txt"
val arr = Array("hello", "World", "!")
val rdd = spark.parallelize(arr)
rdd.saveAsTextFile(outputFileUri)
spark.stop()
}
def main(args: Array[String]): Unit = {
createS3OutputFile()
}
Ich erstelle ein fettes JAR und lade es auf S3 hoch. Ich habe dann SSH in den Cluster-Master und führen Sie den Code mit:
spark-submit \
--deploy-mode cluster \
--class "$class_name" \
"s3://$s3_bucket/$app_s3_key"
Ich sehe dies in der S3-Konsole: anstelle von Dateien Ordner vorhanden sind.
Jeder Ordner (zum Beispiel Test-3.txt) enthält eine lange Liste von Blockdateien. Bild unten:
Wie kann ich Ausgang eine einfache Textdatei S3 als die Ausgabe meines Funkenjobs?
Ich bin neu in Scala und Spark. Was ist der "kanonische" Weg, um Ergebnisse von einem Spark-Job zu erhalten? Schreibst du so wie ich in eine Datei? Erstellt es eine Datei mit nativen Java-Funktionen? – BlackSheep
@BlackSheep Kommt wirklich auf die Aufgabe an, gibt es wirklich keinen offiziellen Weg. Wie beim Erstellen der Datei wird jede RDD-Partition die Aufgabe ausführen, die Sie ihr aufgetragen haben. In diesem Fall erstellt jede RDD-Partition eine Datei und schreibt in ihre eigene Datei. – TheM00s3
Dies erzeugt immer noch die Ordnerstruktur, aber mit nur einem Kind 'part-00000'. – Tim