2017-07-24 9 views
1

Ich habe zwei Docker-Container auf Ubuntu ausgeführt, einer von ihnen ist für Hadoop-Namenknoten und ein anderer für Hadoop-Datanode.Verbindung zu Andock-Container außerhalb Docker-Host nicht möglich

Jetzt habe ich meine Java-Code läuft auf Windows verwenden Hadoop FileSystem API, um eine Datei von meinem Windows-Dateisystem zu remote docker hdfs zu kopieren.

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.FileUtil; 
import org.apache.hadoop.fs.Path; 
import org.junit.Test; 

import java.io.File; 

public class HadoopTest { 

    @Test 
    public void testCopyFileToHDFS() throws Exception { 
     Configuration configuration = new Configuration(); 
     configuration.addResource(getClass().getClassLoader().getResourceAsStream("hadoop/core-site.xml")); 
     configuration.addResource(getClass().getClassLoader().getResourceAsStream("hadoop/yarn-site.xml")); 
     FileSystem fileSystem = FileSystem.get(configuration); 
     FileUtil.copy(new File("c:\\windows-version.txt"),fileSystem, new Path("/testsa"), false,configuration); 
    } 
} 

aber ich habe den folgenden Fehler:

16:57:05.669 [Thread-4] DEBUG org.apache.hadoop.hdfs.DFSClient - Connecting to datanode 172.18.0.2:50010 
16:57:15.654 [IPC Client (547201549) connection to /192.168.56.102:9000 from ignis] DEBUG org.apache.hadoop.ipc.Client - IPC Client (547201549) connection to /192.168.56.102:9000 from ignis: closed 
16:57:15.655 [IPC Client (547201549) connection to /192.168.56.102:9000 from ignis] DEBUG org.apache.hadoop.ipc.Client - IPC Client (547201549) connection to /192.168.56.102:9000 from ignis: stopped, remaining connections 0 
16:57:26.670 [Thread-4] INFO org.apache.hadoop.hdfs.DFSClient - Exception in createBlockOutputStream 
java.net.ConnectException: Connection timed out: no further information 
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) 
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) 
    at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206) 
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:531) 
    at org.apache.hadoop.hdfs.DFSOutputStream.createSocketForPipeline(DFSOutputStream.java:1533) 
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1309) 
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1262) 
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:448) 
16:57:26.673 [Thread-4] INFO org.apache.hadoop.hdfs.DFSClient - Abandoning BP-53577818-172.18.0.2-1500882061263:blk_1073741827_1003 

Sie können die erste Zeile Fehler sehen, die "Anschluss an DataNode 172.18.0.2:50010", sagt eine Adresse Docker interne IP ist.

Mein Java-Code läuft auf einem echten Windows-Rechner, der sich außerhalb des Docker-Host-Rechners befindet.

Ich habe Hadoop HDFS-Ports (z. B. 9000 und 50010) zu meinem Docker-Host (Ubuntu) zugeordnet. So kann ich den HDFS-Namen-Knoten über Docker-Host-IP-Adresse und den HDFS-Port zugreifen.

Im Folgenden sind die Logik meines Java-Code:

1) Java-Code auf Windows-Maschine läuft

2) Java-Code verwendet Filesystem api-Datei von Windows auf Remote-HDFS zu kopieren.

3) Der Kunde kann aus Andockfensters Behälter (zB 9000)

4) HDFS NameNode Server die Anforderung von dem Client und das Rückdatenknotens sendet hand kartiert Andockfensters Wirtes zu HDFS Name Knoten verbinden Adresse und Ports Ip unter Verwendung von IP-Adresse an den Client. IP-Adresse des den Datenknoten

6) Client bekam den Fehler

5) Client versucht Datei durch die Verwendung von lokal zu kopieren, die die IP-Adresse des Datenknoten nicht mehr zugänglich sein kann, weil es eine IP-Adresse innerhalb Docker Behälter

enter image description here

+0

Wo läuft dann Ihr Java-Code? Warum können Sie die Ports für diese beiden Dienste nicht dem Host zuordnen? – Grimmy

+0

Bitte sehen Sie sich meine Updates an. –

+0

Warum versuchen Sie nicht, dass Sie Java-Code, der auf '' '192.168.1.25: 50010''' zeigen, sollten Sie Port in Ihrem Docker-Container aktivieren. Zum Beispiel '' 'Docker laufen -p 50010: 50010''' –

Antwort

2

Schließlich fand ich Lösung von Hostnamen für DataNode einführen und hdfs Client verwenden Hostnamen anstelle der IP-Adresse aktivieren, wenn auf DataNode verbinden, mein Klient muß auch DataNode Hostnamen als docker Host-IP-Adresse zuordnen, unten sind Detailschritte:

  1. hinzufügen Hostnamen für Docker DataNode Container in Docker-compose.xml

    Host-Name: datanode.company.com

  2. hdfs aktivieren (Server & Client) Host-Namen zu verwenden, anstatt die IP-Adresse .

<configuration> 
 
    <property> 
 
     <name>dfs.client.use.datanode.hostname</name> 
 
     <value>true</value> 
 
    </property> 
 
    <property> 
 
     <name>dfs.datanode.use.datanode.hostname</name> 
 
     <value>true</value> 
 
    </property> 
 
</configuration>

  1. Karte Docker DataNode Hostnamen als Host-IP-Adresse Docker durch einen Eintrag in der Datei von etc/hosts

    192.168.1.25 datanode.company.com

+0

Danke. Das hat mir wirklich geholfen. – Zilvinas

Verwandte Themen