【问题标题】:What is the difference between OutputStream and FSDataOutputStream when using Hadoop?使用 Hadoop 时,OutputStream 和 FSDataOutputStream 有什么区别?
【发布时间】:2017-07-26 04:14:51
【问题描述】:

我是使用 Hadoop 的新手,在参考一本书时,我看到了许多可互换使用 OutputStreamFSDataOutputStream 与 HDFS 文件系统交互的示例。谁能简要解释一下这两个类之间的区别?

【问题讨论】:

  • OutputStream 是常用流类如FileOutputStreamByteArrayOutputStream 等的Java 超类。它是抽象的。 FSDataOutputStream 特定于 hadoop,在层次结构中较低。

标签: java hadoop hdfs


【解决方案1】:

Apache Hadoop 使用 FSDataOutputStream 类在 JDK DataOutputStream 上分层附加功能。浏览JavaDocs,我们可以看到子类中定义了一些额外的方法:

  • getPos():返回流中的当前位置。
  • hflush():特定于 HDFS 的附加功能允许调用者刷新文件数据并使其对同一文件的并发读取器可见。
  • hsync():特定于 HDFS 的附加功能允许调用者将文件数据刷新/同步到 DataNode 的底层磁盘以实现持久性。
  • setDropBehind(Boolean):控制在 DataNode 上使用 fadvise 系统调用在读取后从缓冲区缓存中逐出块数据。

所有这些都是未在基本流类中定义的功能,但有助于 Hadoop 内部和应用程序实现所需的语义并提高性能。此功能的著名用户包括 Hadoop 作业历史跟踪和 HBase。

一般来说,应用程序代码最好使用尽可能抽象的类以避免与特定子类的紧密耦合。这可能解释了使用 OutputStream 的代码示例。如果不需要FSDataOutputStream 的额外功能,则无需引用。

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2020-03-17
    相关资源
    最近更新 更多