Scala 使用临时凭证从AWS外部通过spark从s3读取数据

Scala 使用临时凭证从AWS外部通过spark从s3读取数据,scala,apache-spark,hadoop,amazon-s3,sbt,Scala,Apache Spark,Hadoop,Amazon S3,Sbt,我正试图通过IntelliJ从我的笔记本电脑上读取s3中的一个文件,这样我就可以更轻松地开发我的spark工作 textFile RDD代码在EMR集群内的齐柏林飞艇中工作,但在本地尝试时不起作用 在齐柏林飞艇中,我不需要进行任何spark上下文设置,大概是因为它为我进行了设置,因为齐柏林飞艇实例位于AWS环境中 我已经编写了创建临时AWS凭据的代码(使用我的IAM用户密钥),以便我可以向spark上下文提供会话令牌。访问密钥和密钥也来自临时凭据 val sqlContext=sparkSess

我正试图通过IntelliJ从我的笔记本电脑上读取s3中的一个文件,这样我就可以更轻松地开发我的spark工作

textFile RDD代码在EMR集群内的齐柏林飞艇中工作,但在本地尝试时不起作用

在齐柏林飞艇中,我不需要进行任何spark上下文设置,大概是因为它为我进行了设置,因为齐柏林飞艇实例位于AWS环境中

我已经编写了创建临时AWS凭据的代码(使用我的IAM用户密钥),以便我可以向spark上下文提供会话令牌。访问密钥和密钥也来自临时凭据

val sqlContext=sparkSession.sqlContext
sqlContext.sparkContext.Hadoop配置
.set(“fs.s3a.impl”、“org.apache.hadoop.fs.s3native.NativeS3FileSystem”)
sqlContext.sparkContext.Hadoop配置
.set(“fs.s3a.awsAccessKeyId”,accessKeyId)
sqlContext.sparkContext.Hadoop配置
.set(“fs.s3a.access.key”,accessKeyId)
sqlContext.sparkContext.Hadoop配置
.set(“fs.s3a.awsSecretAccessKey”,secretAccessKey)
sqlContext.sparkContext.Hadoop配置
.set(“fs.s3a.secret.key”,secretAccessKey)
sqlContext.sparkContext.Hadoop配置
.set(“fs.s3a.session.token”,sessionToken)
sqlContext.sparkContext.hadoopConfiguration.set(“fs.s3a.credentialsType”、“AssumeRole”)
sqlContext.sparkContext.Hadoop配置
.设置(
“fs.s3a.stsAssumeRole.arn”,
“arn:aws:iam::1234:Working TempCredCode中使用的角色/角色”
)
sqlContext.sparkContext.hadoopConfiguration.set(
“fs.s3a.aws.credentials.provider”,
“org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider”
)
sqlContext.sparkContext.textFile(
“s3a://path/to/file/that/definally/exists/3714bb50a146.gz”
).collect()
我期望一个数组包含文件中的数据,但我的权限被拒绝

org.apache.hadoop.security.AccessControlException: Permission denied: s3n://path/to/file/that/definitely/exists/3714bb50a146.gz
    at org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.processException(Jets3tNativeFileSystemStore.java:449)
    at org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.processException(Jets3tNativeFileSystemStore.java:427)
两个问题:

1) 我正在做的是可能的(执行一个从s3本地读取的spark作业)


2) 如果我所做的是可能的,我的spark上下文设置代码是否有效?我觉得我丢失了一个属性或使用了错误的属性键。

去掉关于fs.s3a.impl的那一行。它所做的只是将“s3a”到“现代、受支持、维护的s3a连接器”的默认映射更改为“旧的、过时的、不受支持的S3N连接器”


你不需要那条线。编写spark应用程序的人总是这么做,这只是迷信。Hadoop common知道哪个文件系统类处理s3a URL,就像它知道谁处理“file”和“hdfs”一样有趣,这也许可以解释为什么错误中的协议是“s3n”,即使我通过该行将其设置为“s3a”。这正是为什么错误中的协议是s3n。相信我,这里没有含糊不清的地方。