【问题标题】:FileInputStream for a generic file System通用文件系统的 FileInputStream
【发布时间】:2011-02-19 20:36:26
【问题描述】:

我有一个包含 java 序列化对象的文件,例如“Vector”。我已将此文件存储在 Hadoop 分布式文件系统 (HDFS) 上。现在我打算在其中一个地图任务中读取这个文件(使用方法 readObject)。我想

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

无法工作,因为文件存储在 HDFS 上。所以我想到了使用 org.apache.hadoop.fs.FileSystem 类。但不幸的是,它没有任何返回 FileInputStream 的方法。它所拥有的只是一个返回 FSDataInputStream 的方法,但我想要一个输入流,它可以从文件中读取序列化的 Java 对象,例如向量,而不仅仅是 FSDataInputStream 会执行的原始数据类型。

请帮忙!

【问题讨论】:

    标签: java filesystems hdfs


    【解决方案1】:

    FileInputStream 不会让您方便地直接读取序列化对象。您需要将其包装成ObjectInputStream。您可以对 FSDataInputStream 执行相同操作,只需将其包装到 ObjectInputStream 中,然后您就可以从中读取对象。

    换句话说,如果您有org.apache.hadoop.fs.FileSystem 类型的fileSystem,只需使用:

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

    【讨论】:

    • 使用 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:我遇到了同样的异常,几天以来一直试图找出解决方案,但没有任何运气。你能找出问题所在吗?
    • 我的Java大师同事说这不可能,所以我寻找了另一种方式,即HDFS的NFS网关。虽然我确信,如果界面合适,这也应该有效。
    【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 2012-07-20
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      相关资源
      最近更新 更多