PySpark使用IAM角色访问S3

问题描述:

我想知道PySpark是否支持使用IAM角色的S3访问。具体来说,我有一个业务约束,我必须承担AWS角色才能访问给定的存储区。这在使用boto时很好(因为它是API的一部分),但是我无法找到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

谢谢!

您可以试试Locally reading S3 files through Spark (or better: pyspark)中的方法。

但是我在Bash设置环境变量(AWS_ACCESS_KEY_ID等)的运气好多了...... pyspark会自动为您的会话选择这些变量。

经过更多的研究,我相信这还不支持证据here

其他人建议采取更手动的方法(见this blog post),建议使用boto列出s3键,然后使用Spark并行化该列表以读取每个对象。

这里的问题(我还没有看到他们自己如何解决这个问题)是从桶中列表返回的s3对象不可序列化/ pickle-able(记住:建议这些对象是赋予工作人员通过地图或flatMap读取独立过程)。进一步解决问题的是boto s3客户端本身不可序列化(这在我看来是合理的)。

我们剩下的是每个文件重新创建假设角色s3客户端的唯一选择,这在过去某个点不是最佳或可行的。

如果有人在这个推理或其他解决方案/方法中看到任何缺陷,我很乐意听到它。

访问s3的IAM角色仅支持s3a,因为它使用的是AWS SDK。

您需要将hadoop-aws JAR和aws-java-sdk JAR(及其包装中的第三方Jars)放入您的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>