2017-03-10 49 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

相關問題