FileInputStream для универсальной файловой системы - PullRequest
8 голосов
/ 15 мая 2010

У меня есть файл, который содержит сериализованные объекты Java, такие как «Вектор». Я сохранил этот файл в распределенной файловой системе Hadoop (HDFS). Теперь я намерен прочитать этот файл (используя метод readObject) в одной из задач карты. Я полагаю

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

не будет работать, так как файл хранится в HDFS. Поэтому я подумал об использовании класса org.apache.hadoop.fs.FileSystem. Но, к сожалению, у него нет метода, который возвращает FileInputStream. Все, что у него есть, это метод, который возвращает FSDataInputStream, но мне нужен входной поток, который может читать сериализованные объекты Java, такие как vector, из файла, а не просто примитивные типы данных, которые FSDataInputStream будет делать.

Пожалуйста, помогите!

Ответы [ 2 ]

6 голосов
/ 15 мая 2010

FileInputStream не позволяет легко читать сериализованные объекты напрямую. Вам нужно обернуть его в ObjectInputStream . Вы можете сделать то же самое с FSDataInputStream , просто обернуть его в ObjectInputStream , и тогда вы сможете читать из него ваши объекты.

Другими словами, если у вас есть fileSystem типа org.apache.hadoop.fs.FileSystem, просто используйте:

ObjectInputStream in = new ObjectInputStream(fileSystem.open(path));
0 голосов
/ 13 декабря 2016

Вам нужно преобразовать 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]
...