我正在尝试使用客户端模式从docker化的Apache Spark应用程序连接到独立的Apache Spark集群。
驱动程序向Spark Master和Workers提供其地址。在docker容器内运行时,它将使用some_docker_container_ip
。从外部看不到泊坞窗地址,因此应用程序无法正常工作。
Spark有spark.driver.host
属性。此属性将传递给Master和Workers。我最初的本能是在那里传递主机地址,因此群集将代替可见机器。
不幸的是,spark.driver.host
也用于通过Driver设置服务器。在那里传递主机地址将导致服务器启动错误,因为docker容器无法绑定主机主机下的端口。
这似乎是一个双输的局面。我既不能使用主机地址也不能使用docker容器地址。
理想情况下,我想拥有两个属性。 spark.driver.host-to-bind-to
用于设置驱动程序服务器以及Master和Workers将使用的spark.driver.host-for-master
。不幸的是,我似乎只被一个财产困住了。
另一种方法是在运行docker容器时使用--net=host
。这种方法有许多缺点(例如,其他docker容器无法链接到--net=host
上的容器,并且必须暴露在docker网络之外),我想避免它。
有没有办法在不暴露docker容器的情况下解决驱动程序寻址问题?