【问题标题】:Append to file in HDFS (CDH 5.4.5)附加到 HDFS 中的文件 (CDH 5.4.5)
【发布时间】:2015-09-01 19:37:48
【问题描述】:

这里是 HDFS 的新手。

我有一小段代码来测试附加到文件:

val path: Path = new Path("/tmp", "myFile")
val config = new Configuration()
val fileSystem: FileSystem = FileSystem.get(config)
val outputStream = fileSystem.append(path)
outputStream.writeChars("what's up")
outputStream.close()

此消息失败:

Not supported
java.io.IOException: Not supported
    at org.apache.hadoop.fs.ChecksumFileSystem.append(ChecksumFileSystem.java:352)
    at org.apache.hadoop.fs.FileSystem.append(FileSystem.java:1163)

我查看了 ChecksumFileSystem.java 的源代码,它似乎被硬编码为不支持附加:

@Override
public FSDataOutputStream append(Path f, int bufferSize,
    Progressable progress) throws IOException {
  throw new IOException("Not supported");
}

如何做到这一点?有什么方法可以将默认文件系统更改为确实支持追加的其他实现吗?

【问题讨论】:

    标签: hadoop hdfs cloudera-cdh


    【解决方案1】:

    事实证明,我需要实际运行一个真正的 hadoop namenode 和 datanode。我是hadoop的新手,并没有意识到这一点。如果没有这个,它将使用您的本地文件系统,即 ChecksumFileSystem,它不支持追加。所以我按照博客文章here 让它在我的系统上启动并运行,现在我可以追加了。

    【讨论】:

      【解决方案2】:

      append 方法必须在输出流而不是文件系统上调用。 filesystem.get() 仅用于连接到您的 HDFS。首先在 hdfs-site.xml 中设置 dfs.support.append 为 true

      <property>
             <name>dfs.support.append</name>
             <value>true</value>
      </property> 
      

      使用 stop-all.sh 停止所有恶魔服务,然后使用 start-all.sh 重新启动它。把它放在你的 main 方法中。

      String fileuri = "hdfs/file/path"
      Configuration conf = new Configuration();
      FileSystem fs = FileSystem.get(URI.create(fileuri),conf);
      FSDataOutputStream out = fs.append(new Path(fileuri));
      PrintWriter writer = new PrintWriter(out);
      writer.append("I am appending this to my file");
      writer.close();
      fs.close();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-25
        • 1970-01-01
        • 2018-12-03
        • 1970-01-01
        相关资源
        最近更新 更多