2017-03-10 50 views
0

有三个属性在我spark-defaults.conf,我希望能够动态地设置:为什么Hadoop不尊重在pyspark中设置的'spark.hadoop.fs'属性?

  • 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 &的作为涉及在pyspark设置Hadoop的性能。

在这里,我想记录的后代如何被愚弄,认为你可以通过spark.hadoop.*动态设置它们,因为这是你用来设置这些属性的名称,在spark-defaults.conf,因为你没有得到直接尝试以这种方式设置它们时出错。

许多网站告诉你“设置spark.hadoop.fs.s3a.access.key财产”,但不指定,这只是个案,如果你在pyspark静态地spark-defaults.conf设置它,而不是动态的。

回答

4

事实证明,你不能指定通过Hadoop的属性:

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

,但你必须改用:

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

我相信你只能使用spark.conf.set()为属性列在Spark Configuration页面上。 。

+0

sparkContext.hadoopConfiguration()集(键,值) 检查http://bytepadding.com/big-data/spark/combineparquetfileinputformat/ – KrazyGautam

+0

@KrazyGautam集成测试 - 这是'pyspark'不斯卡拉/ JAVA。 – proinsias

相关问题