2010-05-15 33 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]