我在向hdfs中的现有文件追加数据时遇到问题。我想,如果文件存在,然后附加一行,如果没有,创建一个新的文件名给定。
下面是我写hdfs的方法。
if (!file.exists(path)){
file.createNewFile(path);
}
FSDataOutputStream fileOutputStream = file.append(path);
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
br.append("Content: " + content + "\n");
br.close();
实际上,这个方法写入hdfs并创建一个文件,但正如我提到的,它没有附加。
我就是这样测试我的方法的:
RunTimeCalculationHdfsWrite.hdfsWriteFile("RunTimeParserLoaderMapperTest2", "Error message test 2.2", context, null);
第一个参数是文件名,第二个参数是消息,另外两个参数不重要。
有人知道我错过了什么或做错了什么吗?
3条答案
按热度按时间dgiusagp1#
解决了的。。!!
hdfs支持append。
您只需执行一些配置和简单代码,如下所示:
步骤1:在hdfs-site.xml中将dfs.support.append设置为true:
使用stop-all.sh停止所有守护程序服务,然后使用start-all.sh重新启动它
步骤2(可选):仅当您有单节点群集时,因此必须将复制因子设置为1,如下所示:
通过命令行:
也可以在运行时通过java代码执行相同的操作:
步骤3:创建数据/将数据附加到文件的代码:
请告诉我任何其他帮助。
干杯。!!
vd2z7a6w2#
hdfs不允许
append
操作。实现与附加相同功能的一种方法是:检查文件是否存在。
如果文件不存在,则创建新文件并写入新文件
如果文件存在,请创建一个临时文件。
从原始文件中读取行并将该行写入临时文件(不要忘记换行符)
编写要附加到临时文件的行。
最后,删除原始文件并将临时文件移动(重命名)到原始文件。
huus2vyu3#
实际上,您可以附加到hdfs文件:
从客户端的Angular 看,append操作首先调用distributedfilesystem的append,这个操作会返回一个stream对象fsdataoutputstream out。如果客户机需要将数据附加到此文件,它可以调用out.write进行写入,并调用out.close进行关闭。
我查了hdfs的资料,有
DistributedFileSystem#append
方法:有关详细信息,请参阅演示文稿。
也可以通过命令行追加:
直接从stdin添加行: