Namenode недоступен из внешнего контейнера Docker

#docker #hadoop #ssh #port

#docker #hadoop #ssh #порт

Вопрос:

Я настроил приложение Hadoop и по понятным причинам пытаюсь получить доступ к namenode извне контейнера.

Я предоставил порт с помощью файла 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>
  

Когда я пытаюсь передать telnet 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 на другом конце.

Но когда я пытаюсь подключить по telnet порт 9000, используемый namenode, изнутри контейнера, используя IP-адрес хоста, я получаю:

 [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 работает, но не namenode Hadoop?

Комментарии:

1. Я добавил порты HTTP-интерфейсов компонентов Hadoop, и они отлично работают извне. Есть только namenode, который не будет разговаривать с незнакомцами. Также в журналах namenode нет ничего конкретного.

2. Я просто изменил core-site.xml свойство, используя внешний IP-адрес контейнера. Telnet сработал, это многообещающе.

Ответ №1:

На самом деле мне просто нужно было указать 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>
  

Таким образом, я смог телнетировать 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.
  

Я знаю, что это ошибки, но они подтверждают, что демон ответил и доступен.

Ответ №2:

Я решил эту проблему, отредактировав fs.default.name и добавив еще два свойства в конфигурационный файл следующим образом.

 <property>
    <name>dfs.client.use.datanode.hostname</name>
    <value>true</value>
    <description>Whether clients should use datanode hostnames when connecting to datanodes.</description>
</property>
<property>
    <name>dfs.namenode.rpc-address</name>
    <value>172.17.0.2:9000</value>
</property>
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://172.17.0.2:9000</value>
</property>