如果可能的话,我希望能够使用我的spark scala应用程序使用不同的配置文件维护的〜/ .aws / credentials文件。我知道如何在我的应用程序中为s3a设置hadoop配置,但我不想继续使用硬编码的不同密钥,而宁愿使用我的凭证文件,就像我使用不同的程序一样。我也尝试过使用java {@ val credentials = new DefaultAWSCredentialsProviderChain().getCredentials()
之类的java api,然后创建一个s3客户端,但这不允许我在从s3读取文件时使用我的密钥。我也知道,当我运行我的应用程序时,密钥可以进入core-site.xml
但是我如何管理不同的密钥以及如何使用IntelliJ进行设置以便我可以使用不同的配置文件拉入不同的密钥?
答案 0 :(得分:1)
默认情况下,DefaultAWSCredentialsProviderChain不包含任何提供程序。你需要添加一些,例如:
val awsCredentials = new AWSCredentialsProviderChain(new
auth.EnvironmentVariableCredentialsProvider(), new
auth.profile.ProfileCredentialsProvider(), new
auth.AWSCredentialsProvider())
您可以将它们用于S3客户端,或者正如您提到的Spark:
hadoopConfig.set("fs.s3a.access.key", awsCredentials.getAWSAccessKeyId)
hadoopConfig.set("fs.s3a.secret.key", awsCredentials.getAWSSecretKey)
要在不同的AWS配置文件之间切换,您可以通过设置AWS_PROFILE环境变量在配置文件之间切换。如果需要,很高兴扩展任何特定点。
答案 1 :(得分:0)
如果你设置了AWS_
env vars,spark-submit
会将它们复制为s3a的秘密。
如果要为S3A设置提供程序链,则可以在选项fs.s3a.aws.credentials.provider
中提供提供程序类的列表。如果存在,将使用Configuration实例创建这些提供程序类,否则使用空构造函数。默认列表是:一个用于从URI或配置获取机密,一个用于env vars,最后一个用于EC2 IAM机密。您可以将它们更改为现有的(匿名提供者,会话提供者),或者编写自己的...允许实现com.amazonaws.auth.AWSCredentialsProvider
的任何内容。
您应该能够将fs.s3a.aws.credentials.provider
设置为com.amazonaws.auth.profile.ProfileCredentialsProvider
并在本地获取(可能您需要自己的包装器从传入的配置中提取配置文件名称。这将适用于任何拥有你凭据的主机......如果你只有本地机密并想在其他地方提交工作,它将无法工作。最简单的设置环境变量并让spark-submit传播它们。