복붙노트

[HADOOP] 하둡 setInputPathFilter 오류

HADOOP

하둡 setInputPathFilter 오류

나는 하둡 0.20.2을 사용하고 (즉, 변경할 수 없습니다) 그리고 내 입력 경로에 필터를 추가 할. 다음과 같이 데이터 본다 :

/path1/test_a1
/path1/test_a2
/path1/train_a1
/path1/train_a2

그리고 나는 단지 그 기차를 가진 모든 파일을 처리 할.

FileInputFormat 클래스에보기는 사용하는 제안 :

 FileInputFormat.setInputPathFilter(Job job, Class<? extends PathFilter> filter)

물론, 내가 인터페이스를 확장 할 수 있습니다하지만 난 아직도 구현이없는 - PathFilter는 인터페이스이기 때문에 내 문제가 시작되는이입니다. 그래서 그 대신, 나는 인터페이스를 구현 :

class TrainFilter implements PathFilter
{
   boolean accept(Path path)
   {
      return path.toString().contains("train");
   }
}

코드 컴파일 PathFilter으로 내가 TrainFilter을 사용하면 내가 그것을 실행할 때 입력 경로가 엉망 한, 그러나, 나는 예외를 얻을. 필터를 설정하면 필터를 설정하지 않고, 내 코드는 아래에있는 모든 파일을 통해 실행 / 경로 1은, 그러나, 그것은 오류가 발생합니다 :

InvalidInputException: Input path does not exist hdfs://localhost:9000/path1

내가 드라이버 코드를 설정하는 방법 여기에 있습니다 :

job.setMapperClass(....class);
job.setInputFormatClass(....class);
job.setMapOutputKeyClass(...class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(IntWritable.class);
job.setOutputValueClass(IntWritable.class);

FileInputFormat.setInputPathFilter(job, TrainFilter.class);
FileInputFormat.addInputPath(job, new Path("/path1/"));
FileOutputFormat.setOutputPath(job, new Path("/path2/"));
job.waitForCompletion(true);

내가 잘못 여기서 뭐하는 거지의 어떤 제안?

편집 : 나는 문제를 발견했다. PathFilter의 첫 번째 호출은 항상 디렉토리 자체 (/ 경로 1)이며이 ( "기차")를 포함하지 않기 때문에, 디렉토리 자체가 잘못 때문에 예외가 발생합니다. 어떤 또 다른 질문에 저를 제공합니다 : 어떻게 임의의 경로가 디렉토리인지 여부를 테스트 할 수 있습니다? 내가 아는 모든, 나는 PathFilter의 기본 매개 변수 중 하나가 아닌 파일 시스템에 대한 참조가 필요합니다.

해결법

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

    1.양자 택일로, 당신은 주어진 디렉토리에있는 모든 파일을 통해 루프를 시도하고 파일 이름이 기차로 시작하는지 확인 할 수 있습니다. 예컨대 :

    양자 택일로, 당신은 주어진 디렉토리에있는 모든 파일을 통해 루프를 시도하고 파일 이름이 기차로 시작하는지 확인 할 수 있습니다. 예컨대 :

            Job job = new Job(conf, "myJob");
            List<Path> inputhPaths = new ArrayList<Path>();
    
            String basePath = "/user/hadoop/path";
            FileSystem fs = FileSystem.get(conf);
            FileStatus[] listStatus = fs.globStatus(new Path(basePath + "/train*"));
            for (FileStatus fstat : listStatus) {
                inputhPaths.add(fstat.getPath());
            }
    
            FileInputFormat.setInputPaths(job,
                    (Path[]) inputhPaths.toArray(new Path[inputhPaths.size()]));
    
  2. ==============================

    2.당신은 당신의 필터가 구성 가능한 인터페이스를 구현함으로써 파일 시스템 인스턴스를 얻을 수 (또는 구성 클래스를 확장) 및 setConf 방식의 파일 시스템 인스턴스 변수를 만들 수 있습니다 :

    당신은 당신의 필터가 구성 가능한 인터페이스를 구현함으로써 파일 시스템 인스턴스를 얻을 수 (또는 구성 클래스를 확장) 및 setConf 방식의 파일 시스템 인스턴스 변수를 만들 수 있습니다 :

    class TrainFilter extends Configured implements PathFilter
    {
       FileSystem fileSystem;
    
       boolean accept(Path path)
       {
          // TODO: use fileSystem here to determine if path is a directory
          return path.toString().contains("train");
       }
    
       public void setConf(Configuration conf) {
         if (conf != null) {
           fileSystem = FileSystem.get(conf);
         }
       }
    }
    
  3. ==============================

    3.경로가 "테스트"가 포함되어있는 경우 빠른 수정, 당신은 거짓 반환처럼 대신 화이트리스트의 경로를 블랙리스트 수

    경로가 "테스트"가 포함되어있는 경우 빠른 수정, 당신은 거짓 반환처럼 대신 화이트리스트의 경로를 블랙리스트 수

  4. from https://stackoverflow.com/questions/13452820/hadoop-setinputpathfilter-error by cc-by-sa and MIT license