[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.양자 택일로, 당신은 주어진 디렉토리에있는 모든 파일을 통해 루프를 시도하고 파일 이름이 기차로 시작하는지 확인 할 수 있습니다. 예컨대 :
양자 택일로, 당신은 주어진 디렉토리에있는 모든 파일을 통해 루프를 시도하고 파일 이름이 기차로 시작하는지 확인 할 수 있습니다. 예컨대 :
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.당신은 당신의 필터가 구성 가능한 인터페이스를 구현함으로써 파일 시스템 인스턴스를 얻을 수 (또는 구성 클래스를 확장) 및 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.경로가 "테스트"가 포함되어있는 경우 빠른 수정, 당신은 거짓 반환처럼 대신 화이트리스트의 경로를 블랙리스트 수
경로가 "테스트"가 포함되어있는 경우 빠른 수정, 당신은 거짓 반환처럼 대신 화이트리스트의 경로를 블랙리스트 수
from https://stackoverflow.com/questions/13452820/hadoop-setinputpathfilter-error by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 하이브 테이블의 상단에 몇 줄 추가 (0) | 2019.09.22 |
---|---|
[HADOOP] 그것은 가져 오기 전에 새 파일에 필터와 Sqoop을 증분 가져 오기를 쓸 수 있습니까? (0) | 2019.09.22 |
[HADOOP] 원격 HDFS 액세스 (0) | 2019.09.22 |
[HADOOP] 맵리 듀스를 사용하여 중복 값을 제거하는 방법 (0) | 2019.09.22 |
[HADOOP] TwoDArrayWritable를 사용하여 매퍼에서 2D double 배열을 방출하는 방법 (0) | 2019.09.22 |