我希望spark-defaults.conf
中有三个属性可以动态设置:
spark.driver.maxResultSize
spark.hadoop.fs.s3a.access.key
spark.hadoop.fs.s3a.secret.key
我试图这样做:
from pyspark import SparkConf
from pyspark.sql import SparkSession
conf = (SparkConf()
.setMaster(spark_master)
.setAppName(app_name)
.set('spark.driver.maxResultSize', '5g')
.set('spark.hadoop.fs.s3a.access.key', '<access>')\
.set('spark.hadoop.fs.s3a.secret.key', '<secret>)
)
spark = SparkSession.builder.\
config(conf=conf).\
getOrCreate()
print(spark.conf.get('spark.driver.maxResultSize'))
print(spark.conf.get('spark.hadoop.fs.s3a.access.key'))
print(spark.conf.get('spark.hadoop.fs.s3a.secret.key'))
spark.stop()
这是我得到的输出:
5g
<access>
<secret>
但是当我尝试使用此配置读取S3上的csv文件时,我收到权限被拒绝错误。
如果我通过环境变量设置凭据,我就能读取该文件。
为什么Hadoop不尊重这种指定的凭证?
更新:
我知道其他Q&amp; As与在pyspark中设置Hadoop属性有关。
在这里,我试图为子孙后代记录如何被欺骗,以为您可以通过spark.hadoop.*
动态设置它们,因为这是您在spark-defaults.conf
中设置这些属性时使用的名称,以及因为当你尝试以这种方式设置错误时,你不会直接得到错误。
许多网站都会告诉您设置spark.hadoop.fs.s3a.access.key
属性&#34;但是,如果您在spark-defaults.conf
中静态设置它并且不是动态的,则不要指定这种情况在pyspark
。
答案 0 :(得分:4)
事实证明,您无法通过以下方式指定Hadoop属性:
spark.conf.set('spark.hadoop.<property>', <value>)
但你必须使用:
spark.sparkContext._jsc.hadoopConfiguration().set('<property>', <value>)
我相信您只能将spark.conf.set()
用于Spark Configuration页面上列出的属性。