我用Docker处理了Hadoop应用程序,出于明显的原因,我试图从容器外部访问namenode。
我使用以下命令通过Dockerfile公开了端口:
var d = new Date('2019', '4', '4');
然后我用以下内容启动容器:
EXPOSE 2122 9000
2122启用我用于SSH的端口。我已经安装了SSH服务器,进行了尝试,并且我能够从容器外部通过SSH连接。
我还向Hadoop添加了使用该SSH端口而不是$ docker run -dit --rm --privileged --pid=host -p 2122:2122 -p 9000:9000 --name hnode ns/hnode
的选项。
使用以下core-site.xml:
ENV HADOOP_SSH_OPTS="-p 2122"
当我尝试从容器内远程登录9000时,一切都很好:
<?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>
您清楚地看到它是另一端的名称节点。
但是当我尝试使用主机ip从容器内部远程登录namenode所使用的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.
即使SSH正在工作:
[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的namenode不能工作?
答案 0 :(得分:0)
实际上,我只需要将主机的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>
这样,我能够使用外部路由从内部telnet namenode:
[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.
我知道这些是错误,但是它们确认守护程序已回答并且可以访问。