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
Wo läuft dann Ihr Java-Code? Warum können Sie die Ports für diese beiden Dienste nicht dem Host zuordnen? – Grimmy
Bitte sehen Sie sich meine Updates an. –
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''' –