PySpark使用IAM角色访问S3

Nic*_*ick 7 python amazon-s3 amazon-web-services amazon-iam pyspark

我想知道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')
Run Code Online (Sandbox Code Playgroud)

提供IAM信息是否存在类似的情况?:

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

要么

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

如果没有,使用IAM信用卡的最佳做法是什么?它甚至可能吗?

我正在使用Python 1.7和PySpark 1.6.0

谢谢!

chu*_*ium 5

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

您需要将hadoop-awsJAR和aws-java-sdkJAR(以及其包中的第三方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>
Run Code Online (Sandbox Code Playgroud)


Rob*_*inL 5

Spark 支持 IAM 基于角色对 S3 中的文件进行访问,您只需要小心您的配置即可。具体来说,您需要:

  • aws-java-sdk和的兼容版本 hadoop-aws。这是非常脆弱的,所以只有特定的组合才有效。
  • 您必须使用S3AFileSystem,而不是NativeS3FileSystem。前者允许基于角色的访问,而后者仅允许用户凭据。

要了解哪些组合有效,请访问此处的hadoop-awsmvnrepository 。单击您要查找的编译依赖项的版本。hadoop-awsversionaws-java-sdk

要了解hadoop-aws您正在使用的版本,您可以在 PySpark 中执行:

sc._gateway.jvm.org.apache.hadoop.util.VersionInfo.getVersion()
Run Code Online (Sandbox Code Playgroud)

scSparkContext 在哪里

这对我有用:

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()
Run Code Online (Sandbox Code Playgroud)

正是aws-java-sdk:1.7.4和的特定组合hadoop-aws:2.7.1使其发挥作用。这里有关于 s3a 访问故障排除的很好的指导

特别注意的是

为了让问题“消失”或获得您想要的功能而随机更改 hadoop- 和 aws- JAR,不会带来您想要的结果。

这是一篇有用的帖子,其中包含更多信息。

以下是有关 java 库之间兼容性的一些更有用的信息

我试图让它在jupyter pyspark 笔记本中工作。请注意,aws-hadoop版本必须与 Dockerfile 中的 hadoop 安装相匹配,即此处


max*_*moo 0

您可以尝试通过 Spark(或更好:pyspark)本地读取 S3 文件中的方法。

不过,我在 Bash 中设置环境变量(等)方面运气更好AWS_ACCESS_KEY_ID...... pyspark 会自动为您的会话选择这些变量。