附加到 HDFS 中的文件 (CDH 5.4.5)
Append to file in HDFS (CDH 5.4.5)
这里是 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 方法必须在输出流而不是文件系统上调用。 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();
事实证明,我实际上需要 运行 一个真正的 hadoop namenode 和 datanode。我是 hadoop 的新手,没有意识到这一点。如果没有这个,它将使用您的本地文件系统,它是一个 ChecksumFileSystem,不支持追加。所以我跟着博客 post here 把它弄起来 运行ning 在我的系统上,现在我可以追加了。
这里是 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 方法必须在输出流而不是文件系统上调用。 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();
事实证明,我实际上需要 运行 一个真正的 hadoop namenode 和 datanode。我是 hadoop 的新手,没有意识到这一点。如果没有这个,它将使用您的本地文件系统,它是一个 ChecksumFileSystem,不支持追加。所以我跟着博客 post here 把它弄起来 运行ning 在我的系统上,现在我可以追加了。