복붙노트

[HADOOP] 자바에서 hdfs 폴더 삭제

HADOOP

자바에서 hdfs 폴더 삭제

가장자리 노드에서 실행중인 Java 응용 프로그램에서 hdfs 폴더가 있으면 삭제해야합니다. 그 폴더에서 출력되는 mapreduce 작업 (스파크 포함)을 실행하기 전에 그렇게해야합니다.

나는 그 방법을 사용할 수 있음을 발견했다.

org.apache.hadoop.fs.FileUtil.fullyDelete(new File(url))

그러나 로컬 폴더 (예 : 실행중인 컴퓨터의 파일 URL)에서만 작동하도록 할 수 있습니다. 나는 다음과 같은 것을 사용하려고 시도했다 :

url = "hdfs://hdfshost:port/the/folder/to/delete";

hdfs : // hdfshost : port는 hdfs namenode IPC입니다. 나는 mapreduce를 위해 그것을 사용한다. 그래서 그것은 정확하다. 그러나 아무것도하지 않습니다.

그래서, 어떤 URL을 사용해야합니까, 아니면 또 다른 방법이 있습니까?

참고 : 여기에 간단한 프로젝트가 있습니다.

해결법

  1. ==============================

    1.나는 이렇게 해.

    나는 이렇게 해.

        Configuration conf = new Configuration();
        conf.set("fs.hdfs.impl",org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
        conf.set("fs.file.impl",org.apache.hadoop.fs.LocalFileSystem.class.getName());
        FileSystem  hdfs = FileSystem.get(URI.create("hdfs://<namenode-hostname>:<port>"), conf);
        hdfs.delete("/path/to/your/file", isRecursive);
    

    파일 경로에 hdfs : // hdfshost : port /가 필요하지 않습니다.

  2. ==============================

    2.이것은 나를 위해 작동합니다.

    이것은 나를 위해 작동합니다.

    그냥 내 WordCount 프로그램에서 다음 코드를 추가 할 것입니다 :

    import org.apache.hadoop.fs.*;
    
    ...
    Configuration conf = new Configuration();
    
    Path output = new Path("/the/folder/to/delete");
    FileSystem hdfs = FileSystem.get(URI.create("hdfs://namenode:port"),conf);
    
    // delete existing directory
    if (hdfs.exists(output)) {
        hdfs.delete(output, true);
    }
    
    Job job = Job.getInstance(conf, "word count");
    ...
    

    분산 파일 시스템을 얻으려면 명시 적으로 hdfs : // hdfshost : port를 추가해야합니다. 그렇지 않으면 코드가 로컬 파일 시스템에서만 작동합니다.

  3. from https://stackoverflow.com/questions/28767607/delete-hdfs-folder-from-java by cc-by-sa and MIT license