我想知道PySpark是否支持使用IAM角色进行S3访问。具体来说,我有一个业务限制,我必须承担AWS角色才能访问给定的存储桶。使用boto时可以这样做(因为它是API的一部分),但我无法找到关于PySpark是否支持开箱即用的明确答案。
理想情况下,我希望能够在本地以独立模式运行时扮演一个角色,并将我的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
谢谢
Spark支持对S3中文件的IAM基于角色的访问,您只需小心配置即可。具体而言,您需要:
要了解哪些组合有效,请在此处转到mvnrepository上的hadoop-aws
。单击hadoop-aws
的版本,您可以查找aws-java-sdk
编译依赖项的版本
。
要了解您使用的hadoop-aws
版本,您可以在PySpark中执行:
sc._gateway.jvm.org.apache.hadoop.util.VersionInfo.getVersion()
其中,sc是SparkContext
这就是对我有用的:
import os
import pyspark
from pyspark import SparkContext
from pyspark.sql import SparkSession
os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.1 pyspark-shell'
sc = SparkContext.getOrCreate()
hadoopConf = sc._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
spark = SparkSession(sc)
df = spark.read.csv("s3a://mybucket/spark/iris/",header=True)
df.show()
正是aws java sdk:1.7.4和hadoop aws:2.7.1的具体组合使其工作。这里有很好的s3a访问故障排除指南
特别注意
随机更改hadoop-和aws-JAR以希望使问题“消失”或访问您想要的功能,不会导致您想要的结果。
这里有一篇有用的帖子,包含更多信息。
这里有一些关于java库之间兼容性的更有用的信息
我想在jupyter pyspark笔记本中实现这一点。请注意,aws hadoop版本必须与Dockerfile(即此处)中的hadoop安装相匹配。
Hadoop 2.8的s3a连接器通过一个新的凭证提供者支持IAM角色;它不在Hadoop 2.7版本中。
要使用它,您需要更改凭据提供程序。
fs.s3a.aws.credentials.provider = org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider
fs.s3a.access.key = <your access key>
fs.s3a.secret.key = <session secret>
fs.s3a.session.token = <session token>
Hadoop 2.7(默认情况下启用)中的内容是提取AWS\uuuz环境变量。
如果您在本地系统和远程系统上设置会话登录的AWS环境变量,那么它们应该会被拾取。
我知道这很痛苦,但就Hadoop团队而言,Hadoop 2.7于2016年年中发布,自那以后,我们已经做了很多,我们不会放弃这些东西
用于访问s3的IAM角色仅由s3a支持,因为它使用的是AWS SDK。
您需要将hadoop aws和aws java sdk(以及包中的第三方JAR)放入类路径中。
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>
场景:我在同一个帐户下有一个EC2实例和一个S3 bucket,我在该EC2上的web应用程序希望访问该bucket中的资源。 在官方文档之后,我使用创建了一个IAM角色,并将其分配给EC2实例。根据我的理解,现在我的web应用程序应该可以访问桶。但是,经过试验,我似乎必须添加桶策略,如下所示: 否则我就被禁止进入。 但是,既然我已经向EC2实例授予了IAM角色,为什么还要使用这个桶策略呢?
我已经启动了一个具有IAM角色“WebApp”的EC2实例。角色已附加,我可以使用 webapp角色具有S3的附加策略 我也需要更改bucket权限吗?或者我在Conf上做错了什么。EC2的?
null 根据AWS文档,您应该始终为EC2创建角色,并根据您的需求为角色分配策略。 向一个角色授予多个服务访问权限是否存在安全问题?我问这个问题的原因是,使用EC2元数据,您可以在此时使用该角色获得分配给EC2实例的accesskey信息。EC2经常刷新密钥。 任何反馈或输入。
我正尝试使用IAM角色从spark读取s3桶中的csv文件,但在上获得 我安装了没有hadoop的Spark 2.4.4,安装了hadoop 3.2.1以及hadoop-aws-3.2.1.jar和aws-java-sdk-1.11.655.jar。我必须安装一个没有hadoop的spark版本,因为作为spark构建一部分的hadoop jars是来自2016年的2.7.3版本。 附加到角色的“
我使用这个脚本来填充dynamo db:https://docs . AWS . Amazon . com/Amazon DynamoDB/latest/developer guide/loaddataphp . html 我在使用AWS SDK时遇到了这个错误: PHP致命错误:未捕获的异常“Aws\exception\CredentialsException”,消息为“无法从/root/读取凭
问题内容: 我正在尝试使用AWS最近宣布的“ EC2的IAM角色”功能,该功能可让安全凭证自动传递到EC2实例。(请参阅http://aws.amazon.com/about-aws/whats- new/2012/06/11/Announcing-IAM-Roles-for- EC2-instances/ )。 如上所述,我已经设置了一个具有IAM角色的实例。我还可以通过curl获得(貌似)正确