ローカルマシンで実行すると正常に機能するPySparkスクリプトを実行しようとしています。問題は、S3から入力ファイルをフェッチしたいということです。
IDとシークレットをどこに設定したのかわからないようですが、何をしようとしても。特定のファイルに関するいくつかの回答を見つけました例: S3ファイルをSpark(またはより良い:pyspark) を介してローカルで読み取る)==しかし、SparkContext全体の資格情報を設定したいコード全体でSQLコンテキストを再利用します。
質問は次のとおりです。AWSアクセスキーとシークレットをスパークに設定するにはどうすればよいですか?
P.S $ SPARK_HOME/conf /hdfs-site.xmlおよび環境変数オプションを試しました。両方とも機能しませんでした...
ありがとうございました
Pysparkの場合、以下のように資格情報を設定できます
sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", AWS_ACCESS_KEY)
sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", AWS_SECRET_KEY)
sparkセッションを確立する前に、spark.hadoop.fs.s3a.access.key
でspark.hadoop.fs.s3a.secret.key
とspark-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')
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
ディレクトリがクラスパス上にある場合は、core-site.xmlでそれらを設定すると機能するはずです。
ここでいくつかの提案を見ることができます: 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","");