我试图访问需要SSL的服务(让我们说mongodb),但是由于我没有设置正确的SSL配置,连接被执行器拒绝。
我知道提交工作时,spark支持以下配置:
spark.executor.extraJavaOptions
spark.driver.extraJavaOptions
然后我们可以设置jvm ssl路径(分别设置密码):
javax.net.ssl.trustStore
javax.net.ssl.keyStore
但是,jvm要求这些路径为物理路径,这在使用亚马逊的Spark EMR或任何其他无法提供光盘访问权限的火花群集时会导致问题,因为可以在其中预先部署所需的文件。
所以基本上我的问题是:
有没有一种火花工作的方法可以将truststore / keystore文件推送给所有执行者? --files可以将文件推送给所有执行者,但是为了设置正确的配置,我将不得不在每个执行者中获取absaloute路径。
是否有其他工作可以让所有执行者去工作? (在这项工作中,我们可以将信任库/密钥库从中立位置推到执行者上下文中的tmp文件中)
jvm是否可以配置为处理URI,即
javax.net.ssl.trustStore = s3a://path/to/keystore.key吗?
最佳答案
更新:
对于AWS EMR解决方案,您可以使用bootstrap操作启动脚本,该脚本将从s3复制到服务器上的预定义路径。将在EMR群集下创建的每个服务器将单独运行此脚本。
不幸的是,YARN的工作方式是spark作业从YARN请求资源,因此运行了spark作业,该作业从s3复制文件并将其下载到共享路径
(注意:Files.createTempFile(..)在这里无法工作,因为tmp文件夹被覆盖到executor上下文文件夹中)
不能保证所有节点都有此路径。此外,一旦作业完成,执行程序就不再具有用于指定SSL配置的JVM参数,因此一旦创建了新的执行程序,它就不再具有与上一个相同的JVM。
解决此问题的另一种方法是为每个正在运行的spark作业设置此SSL参数,但是此代码必须在spark lib中,因为需要在与RDD源建立任何连接之前执行该代码。例如mongo连接器:应用程序进入
val rdd = MongoSpark.load(..)
与mongo建立连接已经为时已晚。