Skip to main content
 首页 » 编程设计

python之将文件保存到 Amazon Web Service s3

2025年02月15日7Renyi-Fan

问题:我想从 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方法呢?

请您参考如下方法:

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

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

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

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

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

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

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