无法访问位于 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=Hspark.driver.bindAddress=fooHostname。这样做run ... --hostname fooHostname -p 4040:4040/tcp .. 如果您的 spark master 是本地类型,则此答案不合适。如果您的 4040 端口映射到 docker 容器端口,那么这应该可以工作。在远程主机上执行 docker ps 并确保端口映射正确。

以上是关于无法访问位于 Docker 容器内的 Spark Web UI的主要内容,如果未能解决你的问题,请参考以下文章

没有 --net=host 参数的 docker 容器内的网络无法访问

无法连接到 Docker 容器内的 MongoDB

使用docker-compose时无法访问docker容器内的spring-boot rest-endpoint

如何将 PyCharm 连接到位于 Docker 容器内的 python 解释器?

centos 中,启用了 firewalld 防火墙,docker 内的容器无法访问外网

Chrome 无法从 docker 容器内的调试端口提供服务