附加到hdfs中的文件(cdh5.4.5)

kb5ga3dv  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(407)

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

如何做到这一点?是否有某种方法可以将默认文件系统更改为支持append的其他实现?

8yoxcaq7

8yoxcaq71#

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

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

使用stop-all.sh停止所有demon服务,然后使用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();
ubof19bj

ubof19bj2#

结果我需要运行一个真正的hadoop namenode和datanode。我是hadoop的新手,没有意识到这一点。否则,它将使用您的本地文件系统,它是一个checksumfilesystem,不支持append。因此,我跟随这里的博客文章,让它在我的系统上运行,现在我可以附加。

相关问题