【问题标题】:Pyspark AWS credentialsPyspark AWS 凭证
【发布时间】:2018-04-08 01:17:44
【问题描述】:

我正在尝试运行一个 PySpark 脚本,当我在本地计算机上运行它时它运行良好。 问题是我想从 S3 获取输入文件。

无论我尝试什么,我似乎都无法找到我设置 ID 和密码的位置。我找到了一些关于特定文件的答案 例如:Locally reading S3 files through Spark (or better: pyspark) 但我想为整个 SparkContext 设置凭据,因为我在我的代码中重用了 sql 上下文。

所以问题是:如何将 AWS 访问密钥和密钥设置为 spark?

P.S 我尝试了 $SPARK_HOME/conf/hdfs-site.xml 和环境变量选项。两者都没有工作......

谢谢

【问题讨论】:

    标签: amazon-web-services apache-spark amazon-s3 pyspark


    【解决方案1】:

    对于 pyspark,我们可以如下设置凭据

      sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", AWS_ACCESS_KEY)
      sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", AWS_SECRET_KEY)
    

    【讨论】:

    • 谢谢,好像可以了
    • 只是为了将来寻找这个的人,请记住 sc 是 SparkContext:sc = SparkContext.getOrCreate(conf)
    【解决方案2】:

    在建立 spark 会话之前在 spark-defaults.conf 中设置 spark.hadoop.fs.s3a.access.keyspark.hadoop.fs.s3a.secret.key 是一个不错的方法。

    但是,Spark 2.3.2 和 pyspark shell 从 spark 会话中动态设置这些也取得了成功,执行以下操作:

    spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.access.key", AWS_ACCESS_KEY_ID)
    spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.secret.key", AWS_SECRET_ACCESS_KEY)
    

    然后,可以使用 s3a 从 S3 读取/写入:

    documents = spark.sparkContext.textFile('s3a://bucket_name/key')
    

    【讨论】:

    • 密钥“fs.s3a.access.key”和“fs.s3a.secret.key”在使用“fs.s3a.awsAccessKeyId”和“fs.s3a.awsSecretAccessKey”的情况下对我有用不是。
    【解决方案3】:

    当时我不确定这是否属实,但从 PySpark 2.4.5 开始,您不需要访问私有 _jsc 对象来设置 Hadoop 属性。您可以使用 SparkConf.set() 设置 Hadoop 属性。例如:

    import pyspark
    conf = (
        pyspark.SparkConf()
            .setAppName('app_name')
            .setMaster(SPARK_MASTER)
            .set('spark.hadoop.fs.s3a.access.key', AWS_ACCESS_KEY)
            .set('spark.hadoop.fs.s3a.secret.key', AWS_SECRET_KEY)
    )
    
    sc = pyspark.SparkContext(conf=conf)
    

    https://spark.apache.org/docs/latest/configuration.html#custom-hadoophive-configuration

    【讨论】:

      【解决方案4】:

      您可以在这里看到一些建议: http://www.infoobjects.com/2016/02/27/different-ways-of-setting-aws-credentials-in-spark/

      我通常做第三个(在 SparkContext 上设置 hadoopConfig),因为我希望凭据成为我的代码中的参数。这样我就可以在任何机器上运行它。

      例如:

      JavaSparkContext javaSparkContext = new JavaSparkContext();
      javaSparkContext.sc().hadoopConfiguration().set("fs.s3n.awsAccessKeyId", "");
      javaSparkContext.sc().hadoopConfiguration().set("fs.s3n.awsSecretAccessKey","");
      

      【讨论】:

      • 我在 PySpark 中寻找答案......不过,谢谢,它看起来是一个正确的答案
      • 抱歉,我已经习惯用 Java 工作了,我完全忘记了你要 Pyspark :)
      【解决方案5】:

      将 AWS_ACCESS_KEY 和 AWS_SECRET_ACCESS_KEY 添加到 hdfs-site.xml 的方法应该可以正常工作。只需确保按如下方式运行 pyspark 或 spark-submit:

      spark-submit --master "local[*]" \
          --driver-class-path /usr/src/app/lib/mssql-jdbc-6.4.0.jre8.jar \
          --jars /usr/src/app/lib/hadoop-aws-2.6.0.jar,/usr/src/app/lib/aws-java-sdk-1.11.443.jar,/usr/src/app/lib/mssql-jdbc-6.4.0.jre8.jar \
          repl-sql-s3-schema-change.py
      
      
      pyspark --jars /usr/src/app/lib/hadoop-aws-2.6.0.jar,/usr/src/app/lib/aws-java-sdk-1.11.443.jar,/usr/src/app/lib/mssql-jdbc-6.4.0.jre8.jar
      

      【讨论】:

        【解决方案6】:

        在 core-site.xml 中设置它们,只要该目录在类路径上,应该可以工作。

        【讨论】:

          猜你喜欢
          • 2016-09-25
          • 1970-01-01
          • 1970-01-01
          • 2020-05-29
          • 2014-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多