2010-05-15 19 views
8

Ich habe eine Datei, die Java serialisierte Objekte wie "Vector" enthält. Ich habe diese Datei über Hadoop Distributed File System (HDFS) gespeichert. Jetzt beabsichtige ich, diese Datei (mit der Methode readObject) in einer der Map-Tasks zu lesen. Ich nehmeFileInputStream für ein generisches Dateisystem

FileInputStream in = new FileInputStream("hdfs/path/to/file"); 

wird nicht funktionieren, wie die Datei über HDFS gespeichert wird. Also dachte ich an die org.apache.hadoop.fs.FileSystem Klasse. Aber leider hat es keine Methode, die FileInputStream zurückgibt. Alles, was es hat, ist eine Methode, die FSDataInputStream zurückgibt, aber ich möchte einen Inputstream, der serialisierte Java-Objekte wie Vektor aus einer Datei lesen kann und nicht nur primitive Datentypen, die FSDataInputStream tun würde.

Bitte helfen!

Antwort

6

FileInputStream ermöglicht es Ihnen nicht direkt serialisierte Objekte zu lesen. Sie müssen es in ObjectInputStream wickeln. Sie können das gleiche mit FSDataInputStream tun, wickeln Sie es einfach in ObjectInputStream und dann können Sie Ihre Objekte daraus lesen.

Mit anderen Worten, wenn Sie fileSystem vom Typ org.apache.hadoop.fs.FileSystem haben, benutzen Sie einfach:

ObjectInputStream in = new ObjectInputStream(fileSystem.open(path)); 
+0

Schön, dass gearbeitet konvertieren! Danke – Akhil

+2

Mit CDH5 ergibt dies einen Fehler. 'fcont = hfs.FileContext.getFileContext(); f = fcont.open (hfs.Path ('/ tmp/test.txt')); ois = java.io.ObjectInputStream (f); ' java.io.StreamCorruptedException: java.io.StreamCorruptedException: ungültiger Stream-Header: 6C6F6700 – Andor

+1

@Andor: Ich habe die gleiche Ausnahme bekommen und habe versucht, eine Lösung zu finden, seit ein paar Tagen, ohne Glück . Konnten Sie herausfinden, wo das Problem lag? – Aditya

-2

Sie müssen die FSDataInputStream wie dieser (scala Code)

val hadoopConf = new org.apache.hadoop.conf.Configuration() 
val hdfs = org.apache.hadoop.fs.FileSystem.get(new  java.net.URI("hdfs://nameserv"), hadoopConf) 

val in = hdfs.open(new org.apache.hadoop.fs.Path("hdfs://nameserv/somepath/myfile")).asInstanceOf[java.io.InputStream] 
Verwandte Themen