为什么Hadoop不尊重spark.hadoop.fs' pyspark中设置的属性?

时间:2017-03-10 20:20:56

标签: hadoop apache-spark amazon-s3 properties configuration

我希望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

1 个答案:

答案 0 :(得分:4)

事实证明,您无法通过以下方式指定Hadoop属性:

spark.conf.set('spark.hadoop.<property>', <value>)

但你必须使用:

spark.sparkContext._jsc.hadoopConfiguration().set('<property>', <value>)

我相信您只能将spark.conf.set()用于Spark Configuration页面上列出的属性。