附加到HDFS文件(CDH 5.4.5)

时间:2015-09-01 19:37:49

标签: hadoop hdfs cloudera-cdh

这里是全新的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");
}

如何使这项工作?有没有办法将默认文件系统更改为 支持附加的其他实现?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

必须在输出流上调用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重新启动它。把它放在你的主要方法中。

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();