docker overlay network只发布列出的一些端口

6gpjuf90  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(500)

我正在与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)

ru9i0ody

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。

相关问题