복붙노트

[HADOOP] HDFS Java의 기존 파일에 데이터 추가

HADOOP

HDFS Java의 기존 파일에 데이터 추가

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. ==============================

    1.실제로 HDFS 파일에 추가 할 수 있습니다.

    실제로 HDFS 파일에 추가 할 수 있습니다.

    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. ==============================

    2.HDFS는 추가 작업을 허용하지 않습니다. 추가 기능과 동일한 기능을 구현하는 한 가지 방법은 다음과 같습니다.

    HDFS는 추가 작업을 허용하지 않습니다. 추가 기능과 동일한 기능을 구현하는 한 가지 방법은 다음과 같습니다.

  3. ==============================

    3.해결 .. .. !!

    해결 .. .. !!

    Append는 HDFS에서 지원됩니다.

    다음과 같이 구성 및 간단한 코드를 수행하면됩니다.

    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
    

    또는 자바 코드를 통해 런타임에 동일한 작업을 수행 할 수 있습니다.

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

    친절하게 다른 도움이 필요하면 알려주세요.

    건배.!!

  4. from https://stackoverflow.com/questions/22997137/append-data-to-existing-file-in-hdfs-java by cc-by-sa and MIT license