2010-05-15 14 views
8

Ho un file che contiene oggetti serializzati java come "Vector". Ho memorizzato questo file su Hadoop Distributed File System (HDFS). Ora intendo leggere questo file (usando il metodo readObject) in una delle attività della mappa. Suppongo cheFileInputStream per un file generico Sistema

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

non funziona come il file viene archiviato su HDFS. Quindi ho pensato di utilizzare la classe org.apache.hadoop.fs.FileSystem. Ma purtroppo non ha alcun metodo che restituisce FileInputStream. Tutto ciò che ha è un metodo che restituisce FSDataInputStream ma voglio un inputstream in grado di leggere oggetti java serializzati come il vettore da un file piuttosto che i tipi di dati primitivi che FSDataInputStream farebbe.

Si prega di aiuto!

risposta

6

FileInputStream non consente di leggere direttamente gli oggetti serializzati. È necessario avvolgerlo in ObjectInputStream. Puoi fare lo stesso con FSDataInputStream, solo avvolgerlo in ObjectInputStream e quindi puoi leggere i tuoi oggetti da esso.

In altre parole, se avete fileSystem di tipo org.apache.hadoop.fs.FileSystem, basta usare:

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

Grande, che ha funzionato! Grazie – Akhil

+2

L'uso di CDH5 genera un errore. 'fcont = hfs.FileContext.getFileContext(); f = fcont.open (hfs.Path ('/ tmp/test.txt')); ois = java.io.ObjectInputStream (f); ' java.io.StreamCorruptedException: java.io.StreamCorruptedException: intestazione del flusso non valido: 6C6F6700 – Andor

+1

@Andor: Ho ricevuto la stessa eccezione e ho cercato di trovare una soluzione da un paio di giorni, senza fortuna . Sei riuscito a scoprire qual era il problema? – Aditya

-2

è necessario convertire il FSDataInputStream come questo (codice Scala)

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] 
Problemi correlati