当前位置: 首页 > 知识库问答 >
问题:

Spark正在发明他自己的AWS秘钥

钦高峯
2023-03-14

我试图读取Spark的s3桶,直到今天Spark总是抱怨请求返回403

hadoopConf = spark_context._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.access.key", "ACCESSKEY")
hadoopConf.set("fs.s3a.secret.key", "SECRETKEY")
hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
logs = spark_context.textFile("s3a://mybucket/logs/*)

斯帕克说......无效的访问密钥[ACCESSKEY]

然而,与相同的ACCESSKEY和秘书处这是工作与AWS-cli

aws s3 ls mybucket/logs/

在python中,这是可行的

resource = boto3.resource("s3", region_name="us-east-1")
resource.Object("mybucket", "logs/text.py") \
            .put(Body=open("text.py", "rb"),ContentType="text/x-py")

所以我的证书无效,问题肯定是Spark的问题。。

今天,我决定打开整个火花的“调试”日志,令我惊讶的是...Spark没有使用我提供的[秘书处],而是...添加一个随机的???

17/03/08 10:40:04调试请求:发送请求:HEADhttps://mybucket.s3.amazonaws.com/Headers:(授权: AWS ACCESSKEY:[RANDON-SECRET-KEY], User-Agent: AWS-sdk-java/1.7.4Mac_OS_X/10.11.6Java_HotSpot(TM)_64-Bit_Server_VM/25.65-b01/1.8.0_65,日期: 3月8日星期三2017 10:40:04GMT,内容类型:应用程序/x-ww-form-urlencoded; charset=utf-8,)

这就是为什么它仍然返回403!Spark没有使用我为fs提供的密钥。s3a。秘密而是发明一个随机的??

作为记录,我正在我的机器(OSX)上本地运行这个命令

spark-submit --packages com.amazonaws:aws-java-sdk-pom:1.11.98,org.apache.hadoop:hadoop-aws:2.7.3 test.py

有人能告诉我这件事吗?

共有3个答案

苍烨然
2023-03-14

这个随机密钥非常有趣。可能AWS SDK正在从操作系统环境获取密码。

在hadoop 2.8中,默认的AWS提供商链显示以下提供商列表:

BasicAWSCredentialsProvider EnvironmentVariableCredentialsProvider SharedInstanceProfileCredentialsProvider

秩序当然重要!在AWSCreentialProviderChain中,从提供该信息的第一个提供商获取第一个密钥。

            if (credentials.getAWSAccessKeyId() != null &&
                credentials.getAWSSecretKey() != null) {
                log.debug("Loading credentials from " + provider.toString());
                lastUsedProvider = provider;
                return credentials;
            } 

请参阅"GrepCode for AWSCreentialProviderChain"中的代码。

我在使用配置文件凭据时也面临类似的问题。SDK正在忽略~/中的凭据。aws/credentials(作为良好实践,我建议您不要以任何方式在程序中存储凭据)。

我的解决方案。。。

将凭据提供程序设置为使用ProfileCreentialsProvider

sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.eu-central-1.amazonaws.com") # yes, I am using central eu server.
sc._jsc.hadoopConfiguration().set('fs.s3a.aws.credentials.provider', 'com.amazonaws.auth.profile.ProfileCredentialsProvider')
易淳
2023-03-14

我遇到了类似的问题。使用有效AWS凭据的请求返回403禁止,但仅在某些计算机上。最终我发现那些特定机器上的系统时间落后了10分钟。同步系统时钟解决了这个问题。

希望这有帮助!

施辉
2023-03-14

(更新为我原来的一个被否决为显然不可接受)

AWS认证协议不会通过网络发送您的秘密。它在信息上签名。这就是为什么你看到的不是你传递的。

欲了解更多信息,请重新阅读。

 类似资料:
  • 我的KMS CMK策略规定,只有我可以执行。 我的同事(在我的CMK上没有这些权限)可以... 打开SecretsManager的AWS控制台>>> 单击>>> 查看我的秘密值! 知道为什么吗? 技术细节: 我确认单击AWS SecretsManager控制台中的按钮确实执行了带有的API调用。 AWS说,只有在调用方在用于加密秘密的CMK上也有的情况下才会起作用(这是有道理的)。(请参阅http

  • 我们在AWS环境中部署了完整的应用程序,我们发现AWS秘密管理器是存储数据库和其他一些组件的秘密的正确选择。

  • 我有一个在AWS EC2机器上运行的HortonWorks集群,我想在上面运行一个使用spark streaming的spark工作,该工作将吞下tweet concernings《权力的游戏》。在尝试在集群上运行它之前,我确实在本地运行了它。代码正在工作,如下所示: 我的问题更确切地说是关于这段特定代码行: 17/07/24 11:53:42 INFO AppClient$ClientEndpo

  • 我有一个秘密存储在使用Terraform模块部署的AWS秘密管理器中,该模块支持秘密循环。我没有访问那个模块的源代码,所以我不能修改它。我想使用Terraform禁用秘密旋转。我应该使用哪种资源?需要如下所示的所有3个参数,并且没有任何参数来禁用循环。属性接受1到365之间的值,因此传递0也不是一个选项。

  • 问题内容: 有什么好的教程/起点可以建议我开发自己的Java库吗? (我现在正在考虑开发一个小型图形库。) 问题答案: 如何开发自己的Java库? 如您所知,Java库通常只是一个包含一些实用程序类的jar文件,目的是在比Java Platform API中的类更高的抽象层次上解决问题。因此,从技术上讲,您只需编写在库中发现有用的类,对其进行编译,将它们打包并编写一些好的文档。 有什么好的教程/起

  • 我一直试图通过WebPack加载一个jquery插件。这个插件被打包为一个npm模块,在它的依赖项中只包括jQuery。我认为webpack会加载jquery实例,而不是使用我在全局上提供ProvidePleugin的实例。我尝试了另一篇stackoverflow文章(在webpack中管理jQuery插件依赖项)中提供的所有解决方案,但它们没有成功;结果总是一样的:“TERMINAL()不是函数