使用Spark on EMR写入S3中的文件

Dan*_*ats 1 scala amazon-s3 amazon-web-services amazon-emr apache-spark

我使用以下Scala代码在S3中创建一个文本文件,在AWS EMR上使用Apache Spark.

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()
  }
Run Code Online (Sandbox Code Playgroud)

我创建了一个胖JAR并将其上传到S3.然后,我将SSH连接到集群主服务器并运行以下代码:

spark-submit \
    --deploy-mode cluster \
    --class "$class_name" \
    "s3://$s3_bucket/$app_s3_key"
Run Code Online (Sandbox Code Playgroud)

我在S3控制台中看到了这一点:而不是文件有文件夹.

在此输入图像描述

每个文件夹(例如test-3.txt)都包含一长串的块文件.图片如下:

在此输入图像描述

如何将简单文本文件输出到S3作为Spark作业的输出?

The*_*0s3 5

试着这样做:

rdd.coalesce(1, shuffle = true).saveAsTextFile(...)

我的理解是该shuffle = true参数将导致这种情况并行发生,因此它将输出单个文本文件,但要小心大量数据文件.

以下是有关此问题的更多详细信息.