我正在尝试运行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变量选项。两者都没有用......
谢谢
答案 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.key
和spark.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中进行设置。