将文件保存到亚马逊网络服务 s3

3
问题: 我想在Amazon自己的集群中保存到AWS S3存储桶,而无需进行身份验证或使用库。基本上,我希望从在Amazon集群上运行的程序保存数据到S3存储桶。
我正在AWS EMR集群中运行一些Python3程序,并尝试将文件保存到AWS S3存储桶中的一个文件夹中,如果该文件夹不存在,则要创建它。
我目前保存文件的方式类似于以下方式。我已经尝试了“with”方法,但它也不起作用。
output = open("s3://mybucket/myfile.txt", "w+")
output.write("hello world\n")

由于某些原因,使用Spark RDDs的方法将RDD保存为part-xxxxx文件到S3存储桶中时,无需提供身份验证即可正常工作。
rdd.saveAsTextFile("s3://mybucket/")
< p > saveAsTextFile() 方法是否需要身份验证,或者在后台进行身份验证?

如果不需要身份验证即可将文件保存到亚马逊的 S3 存储桶中,则是否可以使用 Python 的 open 方法来完成此操作,而无需像 saveAsTextFile() RDD 方法那样需要身份验证呢?

2个回答

1
如果您正在使用EMR,则可能不需要执行任何明确操作来提供身份验证。在EMR集群中创建的机器都被分配了默认的IAM角色(与您的第一个EMR集群一起创建),这些角色应包括读写S3的权限。
IAM角色通过为特定机器授予使用各种AWS API的权限而工作,而不是特定的AWS用户帐户。只要S3请求是从该框发送的,您将不需要提供用户身份验证密钥。
在您的spark代码中,有两个选项可将数据保存到S3:
1)使用Spark自己的RDD和DataFrame写入API(RDD.saveAsTextFile和DataFrame.write)。假设安装了所有正确的库,这些都适用于S3、HDFS或本地文件系统路径。在EMR上,它们将被安装。使用此方法将导致正常的_SUCCESS和part-#####文件被编写,但是您可以使用Spark的coalesce(1)方法将其限制为1个分区文件。
2)使用AWS SDK库手动将文件写入S3。
我倾向于使用选项#1,因为它可以轻松支持不同的目标文件系统,而不需要更改我的代码。此外,您无需担心任何其他库。
另一个注意事项是,如果您正在使用EMR,则"s3://"是任何S3端点的正确前缀,而不是s3n或s3a。

0

不确定你是如何在没有身份验证的情况下上传.part文件到s3的,即使你已经调整了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>")

s3n(本地s3文件系统)现已弃用,取而代之的是使用s3a。在Spark 2.0中,需要配置以下属性才能使用s3a:1. fs.s3a.access.key 2. fs.s3a.secret.key 3. org.apache.hadoop.fs.s3a.S3AFileSystem。 - Nikhil Bhide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接