Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spark上第三方服务的SSL证书_Java_Scala_Apache Spark_Ssl_Emr - Fatal编程技术网

Java spark上第三方服务的SSL证书

Java spark上第三方服务的SSL证书,java,scala,apache-spark,ssl,emr,Java,Scala,Apache Spark,Ssl,Emr,我正在尝试访问一个需要SSL的服务(比如mongodb),但由于没有设置正确的SSL配置,连接被执行器拒绝 我知道在提交作业时,spark支持以下配置: spark.executor.extraJavaOptions spark.driver.extraJavaOptions 然后我们可以设置jvm ssl路径(分别设置密码): 然而,jvm要求这些路径是物理路径,当使用amazon的Spark EMR或任何其他不提供磁盘访问的Spark群集时,会导致问题,在这些群集中可以预先部署所需的文件

我正在尝试访问一个需要SSL的服务(比如mongodb),但由于没有设置正确的SSL配置,连接被执行器拒绝

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

spark.executor.extraJavaOptions
spark.driver.extraJavaOptions
然后我们可以设置jvm ssl路径(分别设置密码):

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

所以基本上我的问题是:

  • spark作业是否有办法将信任库/密钥库文件推送到所有执行者--文件可以将文件推送到所有的执行器,但是为了设置正确的配置,我必须在每个执行器中获取absaloute路径
  • 是否有人要对所有遗嘱执行人进行调查?(在该作业中,我们可以将信任库/密钥库从中立位置推送到executor上下文上的tmp文件)
  • jvm是否可以配置为处理URI,即 javax.net.ssl.trustStore=s3a://path/to/keystore.key
  • jvm是否可以配置为处理URI,即 javax.net.ssl.trustStore=s3a://path/to/keystore.key

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

    通常,通过集群管理工具推出类似的内容。您也可以使用Thread的job submit API来复制文件,但我不知道spark submit的设置如何使您可以添加任意文件,然后将JVM属性设置为禁用它们

    当然,如果它不能做到这一点,并且您确实希望它做到这一点,那么它就是OSS:您可以添加它,甚至(通过测试)将它贡献回来

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

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

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

    val rdd = MongoSpark.load(..) 
    

    与mongo建立连接已经太晚了。

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

    System.setProperty("javax.net.ssl.trustStore", "keystoreFilefullpath")
    System.setProperty("javax.net.ssl.trustStorePassword", "password")
    
    一旦设置了这些参数,Kafka SSL就可以工作了。如果您是从Spark发布,则必须使用--files选项将密钥库文件上载到驱动程序/执行程序


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

    是的,使用EMR引导操作将证书文件从s3 bucket检索到实例。编辑spark executor/driver cmd arg以指向证书文件A,并添加jvm和spark附加jvm属性以指向证书文件。嘿,Cal,感谢您的回复。这是我正在使用的spark submit commad:--conf'spark.driver.extraJavaOptions=-Djavax.net.ssl.trustStoreType=jks-Djavax.net.ssl.trustStore=/tmp/trustfile1.jks-Djavax.net.ssl.ssl.trustStorePassword=password'--conf'spark.executor.extraJavaOptions=-Djavax.net.ssl.trustStoreType=jks-Djavax.net.net.ssl.trustStore=/tmp/trustfile1.jks-Djavax.net.ssl.trustStorePassword=password'--class-class-app.jar没错,我也在使用引导操作将文件下载到计算机中。但我还是无法让它工作。这是我收到的错误:原因:sun.security.validator.validator异常:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397)找到请求目标的有效证书路径位于sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302)的sun.security.validator.validator.validate(validator.java:262)
    System.setProperty("javax.net.ssl.trustStore", "keystoreFilefullpath")
    System.setProperty("javax.net.ssl.trustStorePassword", "password")