docker - Namenode 无法从 Docker 容器外部访问
问题描述
我对一个 Hadoop 应用程序进行了 docker 化,并且出于显而易见的原因,我试图从容器外部访问名称节点。
我使用 Dockerfile 暴露了端口:
EXPOSE 2122 9000
我开始容器:
$ docker run -dit --rm --privileged --pid=host -p 2122:2122 -p 9000:9000 --name hnode ns/hnode
2122 是我用于 SSH 的端口。我已经安装了 SSH 服务器,试了一下,我可以从容器外部通过 SSH 连接。
我还向 Hadoop 添加了选项以使用此 SSH 端口而不是ENV HADOOP_SSH_OPTS="-p 2122"
.
使用以下 core-site.xml:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
当我尝试从容器内部远程登录 9000 时,一切都很好:
[hadoop@1f5c7934fe45 hadoop]$ telnet localhost 9000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
|��☼►☻↑ ")org.apache.hadoop.ipc.RPC$VersionMismatch*>Server IPC version 9 cannot communicate with client version 130♫: @☺Connection closed by foreign host.
你清楚地看到它是另一端的namenode。
但是当我尝试使用主机ip从容器内部远程登录namenode使用的9000端口时,我得到:
[hadoop@1f5c7934fe45 hadoop]$ telnet 172.17.0.2 9000
Trying 172.17.0.2...
telnet: connect to address 172.17.0.2: Connection refused
即使 SSH 正在工作:
[hadoop@1f5c7934fe45 hadoop]$ telnet 172.17.0.2 2122
Trying 172.17.0.2...
Connected to 172.17.0.2.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.4
Protocol mismatch.
Connection closed by foreign host.
为什么 SSH 工作但 Hadoop 的 namenode 不工作?
解决方案
实际上我只需要将主机的 IP 放在 core-site.xml 中而不是 localhost 中:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://172.17.0.2:9000</value>
</property>
</configuration>
这样,我就可以通过外部路由从内部远程登录名称节点:
[hadoop@1f5c7934fe45 hadoop]$ telnet 172.17.0.2 9000
Trying 172.17.0.2...
Connected to 172.17.0.2.
Escape character is '^]'.
|��☼►☻↑ ")org.apache.hadoop.ipc.RPC$VersionMismatch*>Server IPC version 9 cannot communicate with client version 100♫: @☺Connection closed by foreign host.
甚至从外面:
λ curl 192.168.56.1:9000
It looks like you are making an HTTP request to a Hadoop IPC port. This is not the correct port for the web interface on this daemon.
我知道这些是错误,但它们确认守护程序已回答并且可以访问。
推荐阅读
- python - 在 Python 中显示决策树
- java - Spring Cloud Gateway 上的 CORS 配置出错
- reactjs - 由于警告,时钟组件不更新:文本内容不匹配
- javascript - 扩展运算符 JavaScript
- c# - ASP.NET Core 3.1 Web Api HttpPost Action 参数无法接收 axios application/json HttpPost 传递数据
- swift - 视觉语言检测
- nginx - 如何为任何子文件夹设置 nginx 位置
- rust - 在 Rust 中实现 2D 向量
- flutter - Flutter:Getx Controller中的异步函数在初始化时不起作用
- sql - 这个sql有什么问题?对 FROM 子句条目的无效引用