Docker оверлейная сеть публикует sh только некоторые из перечисленных портов - PullRequest
0 голосов
/ 20 января 2020

Я борюсь с публикацией портов в оверлейной сети docker при настройке кластера oop. Я хотел бы опубликовать sh некоторые из портов основного контейнера oop со следующей командой:

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.

Когда я нахожусь в контейнере oop -master и запускаю:

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 в localhost. Я понятия не имею, почему это происходит. По некоторым причинам порты публикуются правильно, не используя оверлейную сеть. Не могли бы вы помочь мне решить мою проблему? Было бы неплохо иметь доступ к веб-интерфейсу.


мой hdfs-сайт. 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>

До сих пор я создал базовую c установку, которая запускает все службы в отдельных контейнерах, распределенных по двум docker хостам:

  • 3 x контейнера zookeeper
  • 3 x контейнера узлов журнала
  • 2 x основных контейнера ( менеджер ресурсов, namenode, HistoryServer и DFSZKFailoverController)
  • 3 x подчиненных контейнера (datanode и nodemanager)

1 Ответ

0 голосов
/ 21 января 2020

Ваш hdfs-сайт. xml не должен быть настроен на использование адресов локального хоста или имени хоста. См. dfs.namenode.http-address.hadoopcluster.nnX props

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

Если наменоде не работает, то это отдельная проблема. Пользовательский интерфейс Spark будет нормально работать без активного Namenode (порт 18080). Вы просто не можете запускать задания Spark, требующие HDFS.

Примечание. Службы NameNode, DataNode + NodeManager, ResourceManager и Spark должны быть отдельными контейнерами (в идеале на отдельных машинах). В противном случае вы просто создаете единственную точку отказа в контейнере и можете использовать правильную виртуальную машину.

...