java - Spark 上第三方服务的 SSL 证书

标签 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 或任何其他不提供磁盘访问权限的 spark 集群时出现问题,在这些集群中可以预先部署所需的文件。

所以基本上我的问题是:

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

最佳答案

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

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

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

val rdd = MongoSpark.load(..) 

连接到 mongo 已经太晚了。

关于java - Spark 上第三方服务的 SSL 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48135422/

相关文章:

scala - 使用未应用功能丰富 PartialFunction

scala - 如何在 netbeans (Windows) 上使用 scala

java - 通过Vmware在Cloudera中的Eclipse上使用Spark和Java创建Wordcount项目时出错

apache-spark - 连接到 VM 上运行的 Spark

apache-spark - Spark : Programatic schema dynamic column mapping

Java 无法识别一台计算机上日志文件中的换行符\n

java - 使用 dks KeyStore 类型配置多个 java keystore 时出错

java - 错误无法检测 ServletContainerInitializers Tomcat 8

scala - 如何使用 Spark 读取不断更新的 HDFS 目录并根据字符串(行)将输出拆分为多个 HDFS 文件?

Java - 枚举通配符