Pyspark AWS凭证

时间:2017-10-26 15:15:20

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

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

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

所以问题是:如何设置AWS Access密钥和密钥以激发火花?

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

谢谢

6 个答案:

答案 0 :(得分:7)

对于pyspark,我们可以设置下面给出的凭证

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

答案 1 :(得分:3)

在建立Spark会话之前在 string DomainPath = "LDAP://hs.domain.org"; DirectoryEntry searchRoot = new DirectoryEntry(DomainPath); DirectorySearcher search = new DirectorySearcher(searchRoot); //The following filter does work //search.Filter = "(&(objectClass=user))"; search.Filter = string.Format("(&(objectClass=user)(OU=IT Users,OU=HSD Users,DC=hs,DC=domain,DC=org)"); search.PropertiesToLoad.Add("samaccountname"); search.PropertiesToLoad.Add("mail"); search.PropertiesToLoad.Add("usergroup"); search.PropertiesToLoad.Add("displayname");//first name search.PropertiesToLoad.Add("manager"); SearchResult result; SearchResultCollection resultCol = search.FindAll(); if (resultCol != null) { for (int counter = 0; counter < resultCol.Count; counter++) 中设置spark.hadoop.fs.s3a.access.keyspark.hadoop.fs.s3a.secret.key是一种不错的方法。

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

spark-defaults.conf

然后,可以使用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) 从S3进行读/写:

s3a

答案 2 :(得分:2)

我不确定当时是否如此,但是从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

答案 3 :(得分:0)

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

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

例如:

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

答案 4 :(得分:0)

理想情况下,将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

答案 5 :(得分:0)

在目录位于类路径上的情况下,应在core-site.xml中进行设置。