2011-02-27 1 views
2

현재 Hadoop MapReduce를 사용하여 Pdf 파일을 구문 분석하는 분산 응용 프로그램을 작성하고 있습니다. MapReduce 작업 입력은 수천 개의 Pdf 파일 (주로 100KB에서 2MB까지)이며 출력은 파싱 된 텍스트 파일 집합입니다.Hadoop MapReduce에서 하나의지도에 여러 개의 텍스트가 아닌 파일 제공

테스트 목적으로 처음에 나는 Tom White의 Hadoop에서 제공 한 WholeFileInputFormat을 사용했습니다. The Definitive Guide 책은 단일 파일을 단일 맵으로 제공합니다. 적은 수의 입력 파일로도 제대로 작동하지만 분명한 이유로 수천 개의 파일에서 제대로 작동하지 않습니다. 1 초에 완료되는 데 걸리는 작업의 맵은 비효율적입니다.

그래서 내가하고 싶은 것은 하나의지도에 여러 개의 PDF 파일을 제출하는 것입니다 (예 : 여러 파일을 HDFS 블록 크기가 약 64MB 인 단일 청크로 결합). 저의 경우에는 CombineFileInputFormat이 유용하다는 것을 알았습니다. 그러나 나는 추상적 인 클래스를 확장하는 방법을 생각해 낼 수 없기 때문에 각 파일과 파일 이름을 하나의 키 - 값 레코드로 처리 할 수있다.

도움을 주시면 감사하겠습니다. 감사!

답변

1

은 내가 SequenceFile 여기에 사용자의 요구에 맞게 생각 : http://wiki.apache.org/hadoop/SequenceFile

는 기본적으로, 당신은 시퀀스 파일로 모든 PDF 파일을 넣고 맵퍼는 시퀀스 파일 중 하나 개 HDFS 블록에 맞게 많은 PDF 파일을 받게됩니다. 시퀀스 파일을 만들 때 키를 PDF 파일 이름으로 설정하면 값이 PDF의 이진 표현이됩니다.

+0

pdfs가 sequencefiles 일지라도 Hadoop은 filesplit을 사용하여 각 파일에 대한 매퍼를 만듭니다. –

+0

'SequenceFile'을 사용하면 모든 내 10,000 PDF를 'SequenceFile'청크로 변환해야합니다. 다시 말하자면,이 변환 단계에서 각 파일을 각 맵에 제출하는 것입니다. 그리 효율적이지 않습니다. 어쨌든, 귀하의 의견에 감사드립니다. –

+0

시퀀스 파일을 만드는 데 시간이 오래 걸리지 않아야하며 효율성 향상은 해당 파일을 두 번 이상 사용하면 발생합니다. 내가 사용한 이후로 꽤 오랜 시간이 걸렸지 만, 시퀀스 파일은 작업 추적기의 HDFS 청크마다 하나의 Mapper 인스턴스를 생성하고,이 인스턴스는 로컬의 각 레코드에 대해 한 번 map 메소드를 호출합니다 청크 (inputsplit). 제거해야 할 가장 중요한 오버 헤드는 Mapper 인스턴스 내에서 map 메소드를 여러 번 호출하는 것이 아니라 mapper 인스턴스를 만드는 것입니다. – stinkymatt

0

파일에 HDFS 패턴이있는 텍스트 파일을 만들어 입력 파일로 사용할 수 있습니다. 많은 파일에 대해 매퍼 재사용을 제공하지만 데이터 지역에 비용이 듭니다. 데이터가 비교적 작 으면 높은 복제 계수 (데이터 노드 수에 가깝습니다)로 문제를 해결할 수 있습니다.

+0

이 경우 사용자 정의 RecordReader 및 InputFormat을 구현해야합니까, 아니면 사용할 수있는 구현이 있습니까? –