2010-05-15 66 views
8

我有一个文件,其中包含像“向量”Java序列化对象。我通过Hadoop分布式文件系统(HDFS)存储了这个文件。现在我打算在其中一个map任务中读取此文件(使用方法readObject)。我想FileInputStream为通用文件系统

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

不会因为文件存储在HDFS上而工作。所以我想使用org.apache.hadoop.fs.FileSystem类。但不幸的是,它没有任何返回FileInputStream的方法。它只是一个返回FSDataInputStream的方法,但我想要一个可以从文件中读取像vector一样的序列化java对象的输入流,而不仅仅是FSDataInputStream会执行的基本数据类型。

请帮忙!

回答

6

FileInputStream不能直接读取序列化对象。您需要将其包装到ObjectInputStream。你可以用FSDataInputStream做同样的事情,把它包装到ObjectInputStream然后你可以从中读取你的对象。

换句话说,如果你有org.apache.hadoop.fs.FileSystemfileSystem,只需使用:

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

大,是工作!谢谢 – Akhil 2010-05-15 15:11:54

+2

使用CDH5会导致错误。 'fcont = hfs.FileContext.getFileContext(); f = fcont.open(hfs.Path('/ tmp/test.txt')); ois = java.io.ObjectInputStream(f); ' java.io.StreamCorruptedException:java.io.StreamCorruptedException:无效的流标题:6C6F6700 – Andor 2014-04-16 10:06:58

+1

@Andor:我已经得到相同的异常,并且一直试图找出一个解决方案,因为几天没有任何运气。你是否能够找出问题所在? – Aditya 2014-04-20 22:58:06

-2

您需要将FSDataInputStream转换这样的(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]