将文件保存到Amazon Web Service s3

时间:2017-05-10 03:20:01

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

问题:我想从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 RDDs中的方法,而不提供身份验证:

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

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

如果它不需要身份验证将文件保存到Amazon的集群中的S3存储桶,有没有办法使用Python的open方法执行此操作,而无需像saveAsTextFile() RDD方法那样进行身份验证?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

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

答案 1 :(得分:0)

不确定,即使你已经调整了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>")