火花

时间:2018-01-07 08:09:39

标签: java scala apache-spark ssl emr

我试图访问需要SSL的服务(比如mongodb)但是连接被执行者拒绝,因为我没有设置正确的SSL配置。

我知道在提交作业时,spark支持以下配置:

spark.executor.extraJavaOptions
spark.driver.extraJavaOptions

然后我们可以设置jvm ssl路径(和密码):

javax.net.ssl.trustStore
javax.net.ssl.keyStore

然而,jvm要求这些路径是一个物理路径,当使用亚马逊的Spark EMR或任何其他不提供磁盘访问的火花群时,会导致问题,其中可以预先部署所需的文件。

基本上我的问题是:

  1. 有没有办法让spark作业将truststore / keystore文件推送到所有执行程序? --files可以将文件推送到所有执行程序,但是我必须在每个执行程序中获得absaloute路径才能设置正确的配置。
  2. 在所有遗嘱执行人身上有工作吗? (在该作业中,我们可以将信任库/密钥库从中立位置推送到执行程序上下文中的tmp文件)
  3. 可以将jvm配置为处理URI,即 javax.net.ssl.trustStore = s3a://path/to/keystore.key?

3 个答案:

答案 0 :(得分:1)

更新: 对于AWS EMR解决方案,您可以使用引导操作来启动从s3复制到服务器上的预定义路径的脚本。将在EMR集群下创建的每个服务器将单独运行此脚本。

不幸的是YARN的工作方式是spark作业从YARN请求资源,因此运行一个spark文件,从s3复制文件并将其下载到共享路径 (注意 Files.createTempFile(..)不会在这里工作,因为tmp文件夹被覆盖到执行程序上下文文件夹中) 不保证所有节点都有此路径。此外,一旦作业完成,执行程序就不再具有指定SSL配置的JVM参数,因此一旦创建了新的执行程序,它就不再具有与前一个相同的JVM。

此问题的另一个解决方案是为每个正在运行的spark作业设置此SSL参数,但此代码必须位于spark lib中,因为它需要在与RDD源建立任何连接之前执行。例如mongo连接器:一旦应用程序进入

Touchable*

与mongo的连接已经太晚了。

答案 1 :(得分:0)

  

jvm可以配置为处理URI,即   javax.net.ssl.trustStore = s3a://path/to/keystore.key?

不,发生在完全不同的IO级别。

通常推出这样的东西是通过集群管理工具完成的。您也可以获得YARN的作业提交API来复制文件,但我不知道如何设置spark-submit以允许您添加任意文件,然后从中设置JVM属性。

当然,如果它没有这样做,并且你确实想要它,它就是所有的OSS:你可以添加它,甚至(通过测试),贡献它

答案 2 :(得分:0)

这与建立任何其他SSL连接相同。将您的证书导入密钥库,并使用以下代码引用该密钥库

System.setProperty("javax.net.ssl.trustStore", "keystoreFilefullpath")
System.setProperty("javax.net.ssl.trustStorePassword", "password")

一旦设置了这些参数,则Kafka SSL应该起作用。如果您是从Spark发布的,则必须使用-files 选项

将密钥库文件上传到驱动程序/执行程序

-文件选项也适用于在集群模式下运行的Spark应用程序