2016-03-22 19 views
2

PySparkがIAMの役割を使ってS3アクセスをサポートしているのだろうかと思います。具体的には、特定のバケットにアクセスするためにAWSの役割を引き受けなければならないビジネス上の制約があります。これは、APIの一部であるbotoを使用する場合は問題ありませんが、PySparkがこれをサポートしているかどうかについては明確な答えが見つかりません。PySparkがIAMの役割を使ってS3にアクセスする

理想的には、スタンドアロンモードでローカルに実行し、SparkContextをそのs3パスに指定すると、役割を引き受けることができます。私は非IAM通話が通常通り続くことを見ました:

spark_conf = SparkConf().setMaster('local[*]').setAppName('MyApp') 
sc = SparkContext(conf=spark_conf) 
rdd = sc.textFile('s3://<MY-ID>:<MY-KEY>@some-bucket/some-key') 

IAM情報を提供するためにこれは何か存在しますか? :

rdd = sc.textFile('s3://<MY-ID>:<MY-KEY>:<MY-SESSION>@some-bucket/some-key') 

または

rdd = sc.textFile('s3://<ROLE-ARN>:<ROLE-SESSION-NAME>@some-bucket/some-key') 

ない場合は、IAM credsをして作業するためのベストプラクティスは何ですか?それも可能ですか?

私は、Python 1.7とPySpark 1.6.0

を使用してい

ありがとう!

答えて

0

詳細については、hereのようにこれがまだサポートされていないと私は確信しています。

他の人は、botoを使ってs3キーをリストし、次にそのオブジェクトを読み込むためにSparkを使ってそのリストを並列化することを示唆するより手作業のアプローチ(this blog postを参照)を提案しています。

バケット内のリストから返されたs3オブジェクトはシリアライズ可能ではないことを覚えておいてください(これらのオブジェクトはマップやフラットマップを介して独立したプロセスで読むために労働者に与えられる)。さらに問題は、boto s3クライアント自体がでないことです(私の意見では合理的です)。

想定されたロールs3クライアントをファイルに再作成する唯一の選択肢は、特定の時点を過ぎては最適ではない、または実行可能ではないことです。

誰かがこの推論や別の解決策/アプローチに欠陥がある場合、私はそれを聞いてみたいです。

2

s3にアクセスするためのIAMロールは、AWS SDKを使用しているため、s3aによってのみサポートされています。

hadoop-aws JARとaws-java-sdk JAR(およびサードパーティのJARがパッケージに入っています)をCLASSPATHに入れる必要があります。

hadoop-awsリンクです。

aws-java-sdkリンク。その後

core-site.xmlでこれを設定します。

<property> 
    <name>fs.s3.impl</name> 
    <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value> 
</property> 
<property> 
    <name>fs.s3a.impl</name> 
    <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value> 
</property> 
関連する問題