如何在EMR上将密码传递给spark

时间:2017-02-06 14:05:06

标签: apache-spark amazon-s3 pyspark emr amazon-emr

假设您在Amazon EMR上运行的spark群集需要访问postgresql数据库。给它登录和密码的最佳方法是什么? 这些是我们尝试过的一些方法:

  • S3上的配置文件包含信息(不理想,因为密码是S3上的纯文本)
  • 将其作为环境变量作为EMR设置上spark-env的一部分传递(由于执行程序无法访问环境变量,因此无效。可以使用spark.executorEnv。[EnvironmentVariableName]在spark配置中设置它,但是这样再次要求密码在spark配置文件中以明文形式显示,该文件也必须在S3中。

我错过了更好的方法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用EC2实例元数据将秘密推送到每个ec2实例,使用GET调用来检索它。理想情况下,创建一个仅对EMR群集的生命周期有效的登录名/密码,在其被拆除后将其删除(或至少重置密码)。

AFAIK在Spark中没有对此明确支持,但如果您在类路径上获得AWS SDK,则可以使用EC2MetadataUtils来使用它

答案 1 :(得分:0)

  

作为环境变量将其作为EMR设置中spark-env的一部分传递   (由于执行程序无法访问环境,因此无法正常工作   变量。

如果能够在驱动程序中提取变量,则可以通过将其设置为广播变量,将其“传输”给执行程序。如果要在每个执行程序中设置某种DB客户端,则只要广播该值,他们就可以访问该值。

https://blog.knoldus.com/broadcast-variables-in-spark-how-and-when-to-use-them/

答案 2 :(得分:0)

首先,您使用KMS加密密码。然后,您有许多选择将加密的值传递给驱动程序或工作程序。在驱动程序和工作程序内部,您可以使用KMS解密密码。

要传递加密值,您可以

  • 将其传递为spark-submit的参数,或者
  • 通过EMR分类(驾驶员使用spark-env,工人使用udfs进行yarn-env)通过,或
  • 将其作为自举操作的参数传递,并将其添加到类似bashrc的位置(我不推荐)。