web-dev-qa-db-ja.com

PysparkAWS認証情報

ローカルマシンで実行すると正常に機能するPySparkスクリプトを実行しようとしています。問題は、S3から入力ファイルをフェッチしたいということです。

IDとシークレットをどこに設定したのかわからないようですが、何をしようとしても。特定のファイルに関するいくつかの回答を見つけました例: S3ファイルをSpark(またはより良い:pyspark) を介してローカルで読み取る)==しかし、SparkContext全体の資格情報を設定したいコード全体でSQLコンテキストを再利用します。

質問は次のとおりです。AWSアクセスキーとシークレットをスパークに設定するにはどうすればよいですか?

P.S $ SPARK_HOME/conf /hdfs-site.xmlおよび環境変数オプションを試しました。両方とも機能しませんでした...

ありがとうございました

6
Roee N

Pysparkの場合、以下のように資格情報を設定できます

  sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", AWS_ACCESS_KEY)
  sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", AWS_SECRET_KEY)
10
Sahil Desai

sparkセッションを確立する前に、spark.hadoop.fs.s3a.access.keyspark.hadoop.fs.s3a.secret.keyspark-defaults.confを設定することは、それを行うための優れた方法です。

しかし、Spark 2.3.2と、以下を実行するsparkセッション内からこれらを動的に設定するpysparkシェルでも成功しました:

spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.access.key", AWS_ACCESS_KEY_ID)
spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.secret.key", AWS_SECRET_ACCESS_KEY)

そして、s3aを使用してS3から読み取り/書き込みを行うことができます。

documents = spark.sparkContext.textFile('s3a://bucket_name/key')
6
ghukill

AWS_ACCESS_KEYとAWS_SECRET_ACCESS_KEYをhdfs-site.xmlに追加する方法が理想的に機能するはずです。次のように、pysparkまたはspark-submitを実行していることを確認してください。

spark-submit --master "local[*]" \
    --driver-class-path /usr/src/app/lib/mssql-jdbc-6.4.0.jre8.jar \
    --jars /usr/src/app/lib/hadoop-aws-2.6.0.jar,/usr/src/app/lib/aws-Java-sdk-1.11.443.jar,/usr/src/app/lib/mssql-jdbc-6.4.0.jre8.jar \
    repl-sql-s3-schema-change.py


pyspark --jars /usr/src/app/lib/hadoop-aws-2.6.0.jar,/usr/src/app/lib/aws-Java-sdk-1.11.443.jar,/usr/src/app/lib/mssql-jdbc-6.4.0.jre8.jar
0
Abhilash Bolla

ディレクトリがクラスパス上にある場合は、core-site.xmlでそれらを設定すると機能するはずです。

0
Steve Loughran

ここでいくつかの提案を見ることができます: http://www.infoobjects.com/2016/02/27/different-ways-of-setting-aws-credentials-in-spark/

資格情報をコード内のパラメーターにしたいので、通常は3番目の方法(SparkContextにhadoopConfigを設定)を実行します。どんなマシンからでも実行できるように。

例えば:

JavaSparkContext javaSparkContext = new JavaSparkContext();
javaSparkContext.sc().hadoopConfiguration().set("fs.s3n.awsAccessKeyId", "");
javaSparkContext.sc().hadoopConfiguration().set("fs.s3n.awsSecretAccessKey","");
0
AlexM