使用带有spark scala应用程序

时间:2016-07-29 22:15:45

标签: scala amazon-web-services hadoop intellij-idea apache-spark

如果可能的话,我希望能够使用我的spark scala应用程序使用不同的配置文件维护的〜/ .aws / credentials文件。我知道如何在我的应用程序中为s3a设置hadoop配置,但我不想继续使用硬编码的不同密钥,而宁愿使用我的凭证文件,就像我使用不同的程序一样。我也尝试过使用java {@ val credentials = new DefaultAWSCredentialsProviderChain().getCredentials()之类的java api,然后创建一个s3客户端,但这不允许我在从s3读取文件时使用我的密钥。我也知道,当我运行我的应用程序时,密钥可以进入core-site.xml但是我如何管理不同的密钥以及如何使用IntelliJ进行设置以便我可以使用不同的配置文件拉入不同的密钥?

2 个答案:

答案 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传播它们。