将数据附加到hdfs java中的现有文件

oxosxuxt  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(467)

我在向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);

第一个参数是文件名,第二个参数是消息,另外两个参数不重要。
有人知道我错过了什么或做错了什么吗?

dgiusagp

dgiusagp1#

解决了的。。!!
hdfs支持append。
您只需执行一些配置和简单代码,如下所示:
步骤1:在hdfs-site.xml中将dfs.support.append设置为true:

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

使用stop-all.sh停止所有守护程序服务,然后使用start-all.sh重新启动它
步骤2(可选):仅当您有单节点群集时,因此必须将复制因子设置为1,如下所示:
通过命令行:

./hdfs dfs -setrep -R 1 filepath/directory

也可以在运行时通过java代码执行相同的操作:

fsShell.setrepr((short) 1, filePath);

步骤3:创建数据/将数据附加到文件的代码:

public void createAppendHDFS() throws IOException {
    Configuration hadoopConfig = new Configuration();
    hadoopConfig.set("fs.defaultFS", hdfsuri);
    FileSystem fileSystem = FileSystem.get(hadoopConfig);
    String filePath = "/test/doc.txt";
    Path hdfsPath = new Path(filePath);
    fShell.setrepr((short) 1, filePath); 
    FSDataOutputStream fileOutputStream = null;
    try {
        if (fileSystem.exists(hdfsPath)) {
            fileOutputStream = fileSystem.append(hdfsPath);
            fileOutputStream.writeBytes("appending into file. \n");
        } else {
            fileOutputStream = fileSystem.create(hdfsPath);
            fileOutputStream.writeBytes("creating and writing into file\n");
        }
    } finally {
        if (fileSystem != null) {
            fileSystem.close();
        }
        if (fileOutputStream != null) {
            fileOutputStream.close();
        }
    }
}

请告诉我任何其他帮助。
干杯。!!

vd2z7a6w

vd2z7a6w2#

hdfs不允许 append 操作。实现与附加相同功能的一种方法是:
检查文件是否存在。
如果文件不存在,则创建新文件并写入新文件
如果文件存在,请创建一个临时文件。
从原始文件中读取行并将该行写入临时文件(不要忘记换行符)
编写要附加到临时文件的行。
最后,删除原始文件并将临时文件移动(重命名)到原始文件。

huus2vyu

huus2vyu3#

实际上,您可以附加到hdfs文件:
从客户端的Angular 看,append操作首先调用distributedfilesystem的append,这个操作会返回一个stream对象fsdataoutputstream out。如果客户机需要将数据附加到此文件,它可以调用out.write进行写入,并调用out.close进行关闭。
我查了hdfs的资料,有 DistributedFileSystem#append 方法:

FSDataOutputStream append(Path f, final int bufferSize, final Progressable progress) throws IOException

有关详细信息,请参阅演示文稿。
也可以通过命令行追加:

hdfs dfs -appendToFile <localsrc> ... <dst>

直接从stdin添加行:

echo "Line-to-add" | hdfs dfs -appendToFile - <dst>

相关问题