无法访问位于 Docker 容器内的 Spark Web UI
Posted
技术标签:
【中文标题】无法访问位于 Docker 容器内的 Spark Web UI【英文标题】:Cannot reach Spark Web UI located inside a Docker container 【发布时间】:2019-05-17 01:54:15 【问题描述】:我有一个远程虚拟机,我正在开发一个在 Docker 容器中运行的 Spark 应用程序。
2018-12-16 13:07:10 INFO main [AbstractConnector] - Started ServerConnector@79c3f01fHTTP/1.1,[http/1.1]0.0.0.0:4040
2018-12-16 13:07:10 INFO main [Utils] - Successfully started service 'SparkUI' on port 4040.
...
2018-12-16 13:07:10 INFO main [SparkUI] - Bound SparkUI to 0.0.0.0, and started at http://f58300e7e6ea:4040
日志说它正确启动了 SparkUI,但绑定到容器的本地主机。此时我决定在构建阶段EXPOSE
端口 4040 并在 run
期间发布它,-p 4040:4040/tcp
绑定两个端口。
当我尝试从本地计算机(在 Firefox 中)访问 <remote host name>:4040
时,我无法连接到 SparkUI。我也尝试过 telnet,但什么也没有。
当我启动容器时,我可以看到 4040 端口正在使用 netstat
进行监听,但可能无法从远程访问。我怎样才能做到这一点?
基本上我想使用我的浏览器从我的家用电脑访问 SparkUI --> 远程 VM -->(带有 Spark UI 的 Docker 容器)。
远程 VM 运行 RHEL 7。
【问题讨论】:
可以从远程虚拟机内部访问 spark UI 吗? 感谢您的回答@HansikaMadushanWeerasena。好吧,我在 VM 上尝试了nc localhost 4040
并且......我没有得到任何答案!这怎么可能?
你的火花大师是什么?是本地的吗?
@HansikaMadushanWeerasena 是的,它是本地的。
@L.Don,你解决过这个问题吗?我有同样的问题。它声称已经启动,但在该 docker 容器中的 4040 上没有运行任何内容。
【参考方案1】:
在您的日志中,它说 spark UI 是从 started at http://f58300e7e6ea:4040
开始的,这里 f58300e7e6ea
是一个 docker 内部网络主机名。
所以你要做的就是跟随,
首先在您的应用程序中部署之前设置以下两个配置
spark.driver.bindAddress
作为您选择的任何字符串的主机名
spark.driver.host
作为您的远程虚拟机 IP 地址。
其次,当您使用映像部署 docker 容器时,使用 --hostname
标志将主机名引入容器并使用先前选择的字符串。例如docker run --hostname myHostName --ip 10.1.2.3 ubuntu:16.04
【讨论】:
所以假设 container 在私有 ip H 上看到主机。应该设置spark.driver.host=H
和spark.driver.bindAddress=fooHostname
。这样做run ... --hostname fooHostname -p 4040:4040/tcp ..
?
如果您的 spark master 是本地类型,则此答案不合适。如果您的 4040 端口映射到 docker 容器端口,那么这应该可以工作。在远程主机上执行 docker ps 并确保端口映射正确。以上是关于无法访问位于 Docker 容器内的 Spark Web UI的主要内容,如果未能解决你的问题,请参考以下文章
没有 --net=host 参数的 docker 容器内的网络无法访问
使用docker-compose时无法访问docker容器内的spring-boot rest-endpoint
如何将 PyCharm 连接到位于 Docker 容器内的 python 解释器?