【问题标题】:Write to a file in S3 using Spark on EMR在 EMR 上使用 Spark 写入 S3 中的文件
【发布时间】:2017-03-16 11:03:00
【问题描述】:

我使用以下 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()
  }

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

spark-submit \
    --deploy-mode cluster \
    --class "$class_name" \
    "s3://$s3_bucket/$app_s3_key"

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

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

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

【问题讨论】:

    标签: scala amazon-web-services apache-spark amazon-s3 amazon-emr


    【解决方案1】:

    尝试这样做:

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

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

    Here 是有关此问题的更多详细信息。

    【讨论】:

    • 我是 Scala 和 Spark 的新手。从 Spark 作业中获取结果的“规范”方法是什么?它是否以我的方式写入文件?是使用原生 Java 函数创建文件吗?
    • @BlackSheep 真的取决于手头的任务,真的没有官方的方法。至于创建文件,每个RDD分区都会做你告诉它做的任务,所以在这种情况下每个RDD分区都会创建一个文件并写入自己的文件。
    • 这仍然会产生文件夹结构,但只有一个子part-00000
    • @TimP 是的,Spark 就是这样工作的,如果你真的想要它在一个文件中,那我会做一些后期处理。
    • @TheM00s3 您能否举例说明如何在 EMR 的上下文中进行此后处理?如何将输出作为简单文本文件保存到 S3?
    【解决方案2】:

    Spark 是分布式计算。这意味着您的代码在多个节点上运行。

    saveAsTextFile() 方法接受 file path,而不是文件名。

    您可以使用coalesce() 或repartition 来减少零件文件的数量。但它仍然会在文件路径下创建。

    或者,您可以使用Hadoop File System 中的FileUtil 类更改文件名或将多个零件文件合并为单个零件文件。

    将 RDD 存储到 S3

    rdd.saveAsTextFile("s3n://bucket/path/")
    

    另外,请检查this

    【讨论】:

    • 你能举一个例子,将作业的输出作为文件保存到 S3 中吗?您可以选择最简单的输出 - 计数 (#)。如何将其保存为 EMR 中的输出?
    • @BlackSheep:将我的答案更新为将 rdd 存储到 s3。
    • saveAsTextFile 就是我在问题中所说的。这如何解决我的问题?
    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 2018-09-19
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多