将文件保存到 Amazon Web Service s3

Saving a file to Amazon Web Service s3

问题:我想从 Amazon 自己的集群保存到 AWS S3 存储桶,而无需进行身份验证或使用库。基本上我想将数据从 Amazon 集群上的程序 运行 保存到 S3 存储桶。

我是 Amazon Web Service (AWS) EMR 集群中的 运行 一些 Python3 程序,我正在尝试将文件保存到 AWS S3 存储桶中的文件夹中,如果该文件夹没有不存在,我想创造它。

我目前保存文件的方式如下所示。 with 方法我试过了,也没用。

output = open("s3://mybucket/myfile.txt", "w+")
output.write("hello world\n")

出于某种原因,将 RDD 作为 part-xxxxx 文件保存到 S3 存储桶可以使用来自 Spark RDD 的方法而不提供身份验证:

rdd.saveAsTextFile("s3://mybucket/")

saveAsTextFile() 是在没有身份验证的情况下工作还是在后台以某种方式进行身份验证?

如果不需要身份验证就可以将文件从 Amazon 的集群保存到 S3 存储桶,有没有一种方法可以使用 Python 的 open 方法来完成此操作,而不需要像 saveAsTextFile() RDD方法行吗?

不确定,即使您调整了 s3 策略,您是如何在未经身份验证的情况下将 .part 文件上传到 s3 的。我猜您可能已经在系统环境中将 aws 密钥作为属性或在 conf 文件中添加。 为了访问 aws 资源,至少需要提供访问密钥和秘密密钥。此外,现在不推荐使用 s3 方案。 以下代码适用于 hadoop-aws-2.8.0.jar 和 spark 2.1。 (注意:我应该使用 s3a 方案作为 s3n(本机方案)的首选方案。

val spark = SparkSession
              .builder
              .appName("SparkS3Integration")
              .master("local[*]")
              .getOrCreate()
            spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", awsAccessKey)
            spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", awsSecretKey)

 val rdd = spark.sparkContext.parallelize(Seq(1,2,3,4))
 rdd.saveAsTextFile("s3n://<bucket_name>/<path>")

如果您使用的是 EMR,您可能不需要做任何明确的事情来提供身份验证。在 EMR 集群中创建的机器都分配有默认 IAM 角色(使用您的第一个 EMR 集群创建),该角色应包括读取和写入 S3 的权限。

IAM 角色 的工作方式是向特定机器而非特定 AWS 用户帐户授予使用各种 AWS API 的权限。只要从该框发送 S3 请求,您就不需要提供用户身份验证密钥。

您的 spark 代码中有两个选项可将数据保存到 S3:

1) 使用 Spark 自己编写的 RDD 和数据帧 API(RDD.saveAsTextFileDataFrame.write)。假设安装了所有正确的库,这些将适用于 S3、HDFS 或本地文件系统路径。他们将在 EMR 上。使用此方法将导致写入正常的 _SUCCESS 和 part-##### 文件,但您可以使用 Spark 的 coalesce(1) 方法将其限制为 1 个分区文件。

2) 使用 AWS SDK 库 手动将文件写入 S3。

我倾向于使用选项 #1,因为它可以轻松支持不同的目标文件系统,而无需对我的代码进行任何更改。此外,您无需担心任何额外的库。

另外请注意,如果您使用的是 EMR,那么 "s3://" 是任何 S3 端点的正确前缀,而不是 s3n 或 s3a。