我正在与docker overlay网络中的发布端口进行斗争,同时设置hadoop集群。我想用以下命令发布hadoop主容器的一些端口:
docker run -itd --name hadoop-master --hostname hadoop-master --network hadoop \
-p 8088:8088 -p 50070:50070 -p 50090:50090 \
-p 8080:8080 -p 18080:18080 -p 4040:4040 \
hadoop-img
但由于某些原因,只能通过浏览器访问:18080端口。我确信所有的服务都在docker容器中运行。
当我在hadoop主容器中运行时:
curl -v localhost:18080
或者
curl -v hadoop-master:18080
我得到了相同的肯定响应(控制台上显示了一些html),但当我想对端口执行相同的操作时,例如:50070(或任何其他已发布的),它只能通过主机名访问,即:
curl -v hadoop-master:50070 -> displays correct html response
但是当使用localhost时,例如:
curl -v localhost:50070
我得到:
About to connect() to localhost port 50070 (#0)
* Trying ::1...
* Connection refused
* Trying 127.0.0.1...
* Connection refused
* Failed connect to localhost:50070; Connection refused
* Closing connection 0
curl: (7) Failed connect to localhost:50070; Connection refused
所以我猜测端口:50070在docker容器中没有正确Map到localhost。我不知道为什么会这样。由于某些原因,端口在不使用覆盖网络的情况下正确发布。你能帮我解决我的问题吗?最好能访问web ui。
我的hdfs-site.xml看起来像:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/hdfs/datanode</value>
</property>
<!-- HA SETUP -->
<property>
<name>dfs.nameservices</name>
<value>hadoopcluster</value>
</property>
<property>
<name>dfs.ha.namenodes.hadoopcluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hadoopcluster.nn1</name>
<value>hadoop-master-1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hadoopcluster.nn2</name>
<value>hadoop-master-2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.hadoopcluster.nn1</name>
<value>hadoop-master-1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hadoopcluster.nn2</name>
<value>hadoop-master-2:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop-jn-1:8485;hadoop-jn-2:8485;hadoop-jn-3:8485/hadoopcluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.hadoopcluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/HDPV2/journal/node/local/data</value>
</property>
<!-- ZOOKEEPER SETUP -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181</value>
</property>
</configuration>
到目前为止,我已经创建了一个基本设置,它在两个docker主机上的单独容器中运行所有服务:
3个zookeeper容器
3个日志节点容器
2个主容器(资源管理器、namenode、historyserver和dfszkfailovercontroller)
3个从属容器(datanode和nodemanager)
1条答案
按热度按时间ru9i0ody1#
不应将hdfs-site.xml配置为使用本地主机地址或主机名地址。看到了吗
dfs.namenode.http-address.hadoopcluster.nnX
道具dfs.namenode.http-address
默认绑定到0.0.0.0:50070
,因此,一旦您转发它,它将在容器外部可用。此外,还有
dfs.datanode.http.address=0.0.0.0:50075
,也不能碰。你想加上
dfs.namenode.rpc-bind-host=0.0.0.0
如果namenode没有运行,那么这完全是一个单独的问题。spark ui将在没有活动namenode(端口18080)的情况下正常启动。你不能运行需要hdfs的spark作业。注意:namenode、datanode+nodemanager、resourcemanager和spark服务都应该是单独的容器(最好是在单独的机器上)。否则,您只是在容器中建立一个单点故障,还不如使用一个适当的vm。