2010-05-15 8 views
8

Mam plik, który zawiera serializowane obiekty java, takie jak "Vector". Przechowałem ten plik przez Hadoop Distributed File System (HDFS). Teraz zamierzam odczytać ten plik (używając metody readObject) w jednym z zadań map. Przypuszczam, że nie będzie działać, ponieważ plik jest przechowywany w HDFS. Więc pomyślałem o używaniu klasy org.apache.hadoop.fs.FileSystem. Ale Niestety nie ma żadnej metody, która zwraca FileInputStream. Wszystko, co ma, to metoda, która zwraca FSDataInputStream, ale chcę, aby strumień wejściowy mógł odczytywać serializowane obiekty java, takie jak wektor z pliku, a nie tylko prymitywne typy danych, które zrobiłby FSDataInputStream.FileInputStream dla ogólnego pliku System

Proszę pomóc!

Odpowiedz

6

FileInputStream nie daje możliwości odczytu bezpośrednio serializowanych obiektów. Musisz go zawinąć w ObjectInputStream. Możesz zrobić to samo z FSDataInputStream, po prostu zapakuj go w ObjectInputStream, a następnie odczytaj z niego swoje obiekty.

Innymi słowy, jeśli masz fileSystem typu org.apache.hadoop.fs.FileSystem, wystarczy użyć:

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

Wielki, który pracował! Dzięki – Akhil

+2

Korzystanie z CDH5 powoduje błąd. 'fcont = hfs.FileContext.getFileContext(); f = fcont.open (hfs.Path ('/ tmp/test.txt')); ois = java.io.ObjectInputStream (f); ' java.io.StreamCorruptedException: java.io.StreamCorruptedException: nieprawidłowy nagłówek strumienia: 6C6F6700 – Andor

+1

@Andor: Otrzymuję ten sam wyjątek i próbuję znaleźć rozwiązanie od kilku dni, bez żadnego szczęścia . Czy byłeś w stanie dowiedzieć się, jaki był problem? – Aditya

-2

Trzeba przekonwertować FSDataInputStream jak ten (kod 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] 
Powiązane problemy