解决Apache Spark应用程序在Docker容器中以客户端模式运行的问题

我正尝试使用客户端模式从dockerized Apache Spark应用程序连接到独立Apache Spark群集。

司机给火花大师和工人的地址。 在some_docker_container_ip容器中运行时,它将使用some_docker_container_ip 。 docker的地址是不可见的,所以一个应用程序将无法正常工作。

Spark有spark.driver.host属性。 这个属性被传递给主人和工人。 我最初的本能就是在那里传递主机地址,所以群集会代替可见的机器。

不幸的是, spark.driver.host也被Driver用来设置服务器。 在那里传递主机地址会导致服务器启动错误,因为docker容器无法绑定主机主机下的端口。

这似乎是一个双输的局面。 我既不能使用主机地址也不能使用docker容器地址。

理想情况下,我想有两个属性。 spark.driver.host-to-bind-to用于设置驱动程序服务器和由spark.driver.host-for-masterspark.driver.host-for-master 。 不幸的是,它似乎只是一个属性卡住了。

另一种方法是运行--net=host容器时使用--net=host 。 这种方法有许多缺点(例如,其他docker集装箱不能链接到一个容器与--net=host上,必须暴露在dockernetworking之外),我想避免它。

有没有什么办法可以解决驱动程序寻址问题而不暴露docker集装箱?

此问题在https://github.com/apache/spark/pull/15120中得到解决

它将成为Apache Spark 2.1版本的一部分