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

Addressing issues with Apache Spark application run in Client mode from Docker container

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

Driver 将其地址提供给 Spark Master 和 Workers。当 运行 在 docker 容器内时,它将使用 some_docker_container_ip。 docker 地址从外部不可见,因此应用程序将无法运行。

Spark 有 spark.driver.host 属性。这个属性传给Master和Workers。我最初的直觉是在那里传递主机地址,这样集群就会改为寻址可见机器。

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

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

理想情况下,我希望拥有两个属性。 spark.driver.host-to-bind-to 用于设置驱动程序服务器和 spark.driver.host-for-master 将由 Master 和 Workers 使用。不幸的是,我似乎只能使用一个 属性。

另一种方法是在 运行 连接 docker 容器时使用 --net=host。这种方法有很多缺点(例如,其他 docker 容器无法链接到带有 --net=host 的容器,并且必须暴露在 docker 网络之外),我想避免它。

有什么方法可以在不暴露 docker 容器的情况下解决驱动程序寻址问题?

此问题已在 https://github.com/apache/spark/pull/15120

中修复

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