2016-08-03 2 views
1

Ich benutze Hadoop 2.6, und ich habe einen Cluster von virtuellen Maschinen, wo ich meine HDFS installiert. Ich versuche, eine Datei in meinem HDFS durch einig Java-Code aus der Ferne lesen läuft auf meinem lokalen, in der grundlegenden Art und Weise, mit einem BufferedReaderBlockMissingException beim Remote-Lesen von HDFS-Datei von Java in Hadoop 2

FileSystem fs = null; 
    String hadoopLocalPath = "/path/to/my/hadoop/local/folder/etc/hadoop"; 
    Configuration hConf = new Configuration(); 
    hConf.addResource(new Path(hadoopLocalPath + File.separator + "core-site.xml")); 
    hConf.addResource(new Path(hadoopLocalPath + File.separator + "hdfs-site.xml")); 
    try { 
     fs = FileSystem.get(URI.create("hdfs://10.0.0.1:54310/"), hConf); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
     System.exit(-1); 
    }   
    Path startPath = new Path("/user/myuser/path/to/my/file.txt"); 

    FileStatus[] fileStatus; 
    try { 
     fileStatus = fs.listStatus(startPath); 
     Path[] paths = FileUtil.stat2Paths(fileStatus); 

     for(Path path : paths) { 
      BufferedReader br=new BufferedReader(new InputStreamReader(fs.open(path))); 
      String line = new String(); 
      while ((line = br.readLine()) != null) { 
       System.out.println(line); 
      } 
      br.close(); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Das Programm kann richtig die HDFS zugreifen (keine Ausnahme ist gestiegen). Wenn ich die Dateien und Verzeichnisse per Code auflisten möchte, kann sie diese ohne Probleme lesen.

Nun ist das Problem, dass, wenn ich versuche, eine Datei zu lesen (wie im Code gezeigt), es stecken bleibt, während (in der while) zu lesen, bis er die BlockMissingException

org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-2005327120-10.1.1.55-1467731650291:blk_1073741836_1015 file=/user/myuser/path/to/my/file.txt 
at org.apache.hadoop.hdfs.DFSInputStream.chooseDataNode(DFSInputStream.java:888) 
at org.apache.hadoop.hdfs.DFSInputStream.blockSeekTo(DFSInputStream.java:568) 
at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:800) 
at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:847) 
at java.io.DataInputStream.read(DataInputStream.java:149) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) 
at java.io.InputStreamReader.read(InputStreamReader.java:184) 
at java.io.BufferedReader.fill(BufferedReader.java:161) 
at java.io.BufferedReader.readLine(BufferedReader.java:324) 
at java.io.BufferedReader.readLine(BufferedReader.java:389) 
at uk.ou.kmi.med.datoolkit.tests.access.HDFSAccessTest.main(HDFSAccessTest.java:55) 

steigt, was ich schon wissen:

  • ich den gleichen Code direkt an der Maschine versucht, die NameNode läuft, und es funktioniert perfekt
  • ich bereits das Protokoll der NameNode geprüft und hinzugefügt, um den Anwender meiner lokalen Maschine der Gruppe Verwaltung das HDFS (als su von und other related threads)
  • Es sollte keine Probleme mit voll qualifizierten Domänennamen, wie von this thread vorgeschlagen, da ich statische IPs verwenden. Auf der anderen Seite kann die Option "Ihr Cluster läuft in einer VM und der virtualisierte Netzwerkzugriff auf den Client ist blockiert" eine Option sein. Ich würde sagen, wenn es so ist, sollte es mir nicht erlauben, irgendwelche Maßnahmen am HDFS zu machen (siehe nächster Punkt)
  • Der Cluster in einem Netzwerk mit einer Firewall laufen, und ich habe richtig geöffnet und weitergeleitet den Port 54310 (Ich kann auf das HDFS für andere Zwecke zugreifen, um Dateien und Verzeichnisse zu erstellen und deren Inhalt aufzulisten). Ich frage mich, ob es weitere Ports zum Öffnen benötigt für das Lesen von Dateien benötigt

Antwort

0

Können Sie sicherstellen, dass Datanode auch vom Client aus zugänglich ist? Ich hatte ein ähnliches Problem beim Verbinden von Hadoop, das in AWS konfiguriert wurde. Ich bin in der Lage, das Problem zu lösen, durch die Verbindung zwischen allen Datenanschlüsseln und meinem Client-System

+0

Wahrscheinlich ist dies das Problem: Das Netzwerk, an das alle VMs angeschlossen sind, wird von einem Access Point verwaltet, der die Zugriffe regelt. Natürlich gibt es Beschränkungen für den Zugriff mit einem Firewall- und Portweiterleitungsmechanismus, der meinem Client verbietet, auf die Datanodes zuzugreifen. Auf den Namenode kann nur zugegriffen werden, weil ich den Port 54310 geöffnet und an den Nameode weitergeleitet habe. Ich kann nur über den Access Point eine Verbindung zum Netzwerk herstellen. Jetzt frage ich mich, wie ich die Datanodes zugänglich machen kann. – McKracken

+0

Sie können versuchen, die Datei dfs.datanode.address in der Datei hdfs-default.xml zu übernehmen und SSH vom Client aus zu senden. https://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml –

+0

Ok, ich denke, ich muss die 'hdfs-site.xml' von meinem ändern datanodes, die die Optionen 'dfs.datanodes.address',' dfs.datanodes.ipc.address', 'dfs.datanodes.http.address',' dfs.datanodes.https.address' spezifizieren und einen anderen Port für jeden Datenknoten festlegen und dann diese Ports in meinem Access Point weiterleiten. Ist das korrekt? – McKracken

Verwandte Themen