복붙노트

[HADOOP] FileInputFormat.addInputPaths를 사용하여 재귀 적으로 HDFS 경로 추가

HADOOP

FileInputFormat.addInputPaths를 사용하여 재귀 적으로 HDFS 경로 추가

나는 HDFS 구조를 가지고있다.

a/b/file1.gz
a/b/file2.gz
a/c/file3.gz
a/c/file4.gz

나는 고전적인 패턴을 사용하고 있습니다.

FileInputFormat.addInputPaths(conf, args[0]);

자바 맵 감소 작업에 대한 입력 경로를 설정합니다.

args [0]을 a / b로 지정하면 제대로 작동하지만 a 만 지정하면 실패합니다 (내 의도는 4 개의 파일을 모두 처리하려고합니다)

오류

Exception in thread "main" java.io.IOException: Not a file: hdfs://host:9000/user/hadoop/a

아래에 모든 것을 재귀 적으로 추가하려면 어떻게합니까?

나는 간단한 것을 놓치고 있어야합니다 ...

해결법

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

    1.이것은 현재 Hadoop 버전의 버그입니다. 동일한 JIRA가 있습니다. 여전히 열린 상태입니다. 코드를 변경하고 바이너리를 빌드하거나 다음 릴리스에서 수정 될 때까지 기다리십시오. 재귀 적으로 파일 처리를 켜거나 끌 수 있습니다. 자세한 내용은 JIRA에 첨부 된 패치를 확인하십시오.

    이것은 현재 Hadoop 버전의 버그입니다. 동일한 JIRA가 있습니다. 여전히 열린 상태입니다. 코드를 변경하고 바이너리를 빌드하거나 다음 릴리스에서 수정 될 때까지 기다리십시오. 재귀 적으로 파일 처리를 켜거나 끌 수 있습니다. 자세한 내용은 JIRA에 첨부 된 패치를 확인하십시오.

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

    2.Eitan Illuz가 여기에서 언급했듯이 Hadoop 2.4.0에서는 mapreduce.input.fileinputformat.input.dir.recursive 구성 특성이 도입되었습니다. true로 설정하면 입력 형식이 파일을 재귀 적으로 포함하도록 지시합니다.

    Eitan Illuz가 여기에서 언급했듯이 Hadoop 2.4.0에서는 mapreduce.input.fileinputformat.input.dir.recursive 구성 특성이 도입되었습니다. true로 설정하면 입력 형식이 파일을 재귀 적으로 포함하도록 지시합니다.

    Java 코드에서는 다음과 같습니다.

    Configuration conf = new Configuration();
    conf.setBoolean("mapreduce.input.fileinputformat.input.dir.recursive", true);
    Job job = Job.getInstance(conf);
    // etc.
    

    나는이 새로운 재산을 사용하고 있으며 그것이 잘 작동한다는 것을 알았습니다.

    편집 : 더 나은 방법은 FileInputFormat에서 동일한 결과를 얻는 새로운 방법을 사용하는 것입니다.

    Job job = Job.getInstance();
    FileInputFormat.setInputDirRecursive(job, true);
    
  3. from https://stackoverflow.com/questions/8114579/using-fileinputformat-addinputpaths-to-recursively-add-hdfs-path by cc-by-sa and MIT license