2017-03-10 4 views
0

Es gibt drei Eigenschaften in meiner spark-defaults.conf, die ich dynamisch einstellen können wollen:Warum respektiert Hadoop die Eigenschaften von 'spark.hadoop.fs' in pyspark nicht?

  • spark.driver.maxResultSize
  • spark.hadoop.fs.s3a.access.key
  • spark.hadoop.fs.s3a.secret.key

Hier ist mein Versuch, dies zu tun:

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() 

Hier ist die Ausgabe erhalte ich:

5g 
<access> 
<secret> 

Allerdings, wenn ich versuche, eine CSV-Datei auf S3 mit dieser Konfiguration zu lesen, bekomme ich einen Berechtigungsfehler verweigert.

Wenn ich die Anmeldeinformationen über Umgebungsvariablen festlegen, kann ich die Datei lesen.

Warum beachtet Hadoop die angegebenen Anmeldeinformationen nicht?

Update:

ich weiß von anderen Q & Wie in Bezug Hadoop Eigenschaften in pyspark zu setzen.

Hier versuche ich, für die Nachwelt aufzeichnen, wie Sie in das Denken getäuscht werden können, dass man sie dynamisch über spark.hadoop.* festlegen können, da dies der Name ist, dass Sie diese Eigenschaften in spark-defaults.conf setzen verwenden, und da bekommt man nicht ein Fehler direkt, wenn Sie versuchen, sie auf diese Weise festzulegen.

Viele Websites sagen Sie „den spark.hadoop.fs.s3a.access.key Eigenschaft“, aber nicht angeben, dass dies nur der Fall, wenn Sie es statisch in spark-defaults.conf und nicht dynamisch in pyspark gesetzt.

Antwort

4

Es stellt sich heraus, dass Sie nicht Hadoop Eigenschaften über angeben:

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

aber Sie müssen stattdessen verwenden:

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

Ich glaube, Sie nur spark.conf.set() für die verwenden können Eigenschaften aufgeführt auf der Spark Configuration Seite. . (

+0

sparkContext.hadoopConfiguration) Satz (Schlüssel, Wert) den Integrationstest prüfen http://bytepadding.com/big-data/spark/combineparquetfileinputformat/ – KrazyGautam

+0

@KrazyGautam - das ist für 'pyspark' nicht scala /Java. – proinsias

Verwandte Themen