【问题标题】:Saving a file to Amazon Web Service s3将文件保存到 Amazon Web Service s3
【发布时间】:2017-10-08 13:08:21
【问题描述】:

问题:我想从 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 方法那样进行身份验证?

【问题讨论】:

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


    【解决方案1】:

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

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

    您的 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。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • s3n(本机 s3 文件系统)现在已弃用,取而代之的是 s3a。在 Spark 2.0 中,需要配置以下属性才能使用 s3a 1. fs.s3a.access.key 2. fs.s3a.secret.key 3. org.apache.hadoop.fs.s3a.S3AFileSystem跨度>
      猜你喜欢
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 2011-10-07
      • 2015-12-05
      • 2015-04-01
      • 2012-11-10
      • 1970-01-01
      • 2016-08-24
      相关资源
      最近更新 更多