2010-05-15 17 views
8

Tengo un archivo que contiene objetos serializados de Java como "Vector". He almacenado este archivo en Hadoop Distributed File System (HDFS). Ahora tengo la intención de leer este archivo (utilizando el método readObject) en una de las tareas del mapa. Supongo queFileInputStream para un archivo genérico Sistema

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

no funciona, ya que el archivo se almacena en HDFS. Así que pensé en usar la clase org.apache.hadoop.fs.FileSystem. Pero lamentablemente no tiene ningún método que devuelva FileInputStream. Todo lo que tiene es un método que devuelve FSDataInputStream, pero quiero un flujo de entrada que pueda leer objetos Java serializados como vector de un archivo en lugar de solo tipos de datos primitivos que FSDataInputStream haría.

Por favor ayuda!

Respuesta

6

FileInputStream no le da facitily para leer objetos serializados directamente. Debe envolverlo en ObjectInputStream. Puede hacer lo mismo con FSDataInputStream, simplemente envuélvalo en ObjectInputStream y luego puede leer sus objetos desde él.

En otras palabras, si usted tiene fileSystem de tipo org.apache.hadoop.fs.FileSystem, sólo tiene que utilizar:

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

Grande, que funcionó! Gracias – Akhil

+2

Al usar CDH5, se produce un error. 'fcont = hfs.FileContext.getFileContext(); f = fcont.open (hfs.Path ('/ tmp/test.txt')); ois = java.io.ObjectInputStream (f); ' java.io.StreamCorruptedException: java.io.StreamCorruptedException: encabezado de secuencia no válida: 6C6F6700 – Andor

+1

@Andor: He estado recibiendo la misma excepción y he estado tratando de encontrar una solución desde hace un par de días, sin suerte . ¿Pudiste averiguar cuál era el problema? – Aditya

-2

es necesario convertir la FSDataInputStream como esto (código 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] 
Cuestiones relacionadas