将数据追加到HDFS Java中的现有文件

2022-09-02 00:26:49

我在将数据附加到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);

第一个参数是文件的名称,第二个参数是消息,另外两个参数并不重要。

所以任何人都知道我错过了什么或做错了什么?


答案 1

实际上,您可以附加到HDFS文件:

从客户端的角度来看,追加操作首先调用分布式文件系统的追加,此操作将返回一个流对象FSDataOutputStream。如果客户端需要将数据追加到此文件,它可以调用 out.write to write,并调用 out.close to 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>

答案 2

解决。。!!

HDFS 中支持追加。

您只需要执行一些配置和简单的代码,如下所示:

步骤 1:在 hdfs-site 中将 dfs.support.append 设置为 true.xml:

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

请让我知道任何其他帮助。

干杯。!!


推荐