2014-10-21 2 views
0

여러 개의 구분 된 입력 소스를 사용하는 MapReduce 작업을 작성하려고합니다. 모든 소스에는 동일한 정보가 들어 있지만 다른 열에있을 수 있으며 구분 기호는 소스마다 다를 수 있습니다. 소스는 구성 파일에 의해 매퍼에서 구문 분석됩니다. 이 구성 파일을 통해 사용자는 이러한 여러 구분 기호와 열 매핑을 제한 할 수 있습니다. 예를 들어MapReduce 작업에 여러 입력

, 입력 1은 1, 2, 15이 그 특성에 관한 입력 1의 열에있는 구성 등록

input1.separator=, 
input1.id=1 
input1.housename=2 
input1.age=15 

을 사용하여 해석한다.

따라서 매퍼는 각 입력 소스에 사용할 구성 속성을 알아야합니다. 나는 다른 사람들이 일을하고 컴파일러없이 새로운 입력을 추가하기를 원하기 때문에 이것을 하드 코딩 할 수는 없다.

명백한 해결책은 파일 이름을 분할에서 추출하고 그런 식으로 구성을 적용하는 것입니다.

예를 들어, "source1.txt"및 "source2.txt"라는 두 개의 파일을 입력한다고 가정합니다.

source1.separator=, 
source1.id=2 
... 
source2.separator=| 
source2.id=4 
... 

매퍼는 스플릿에서 파일 이름을 가져온 다음 동일한 접두사로 구성 속성을 읽습니다.

그러나 하이브웨어 하우스의 폴더를 가리키고있는 경우에는 사용할 수 없습니다. 나는 약간의 경로를 추출하여이를 사용할 수 있지만, 실제로는 그것이 우아하고 튼튼한 해결책이라고 생각하지 않습니다. 이 작업을 수행하는 더 쉬운 방법이 있습니까?

+0

다른 파일들을 가지고 있다면'MultipleInputs'을 사용할 수 있습니다.그러나이 경우 pathExtraction이 유일한 방법 인 것 같습니다! – blackSmith

+0

제안 된 솔루션과 다른 점은 무엇입니까? 여기서 MultipleInputs를 사용하고 있습니다. MultipleInputs는 파일 이름보다 폴더를 식별하기위한 추가 기능을 제공하지 않습니다. –

답변

0

해결했습니다. 입력 소스 (파일 또는 디렉토리)가 FileInputFormat에 추가 된 순서가 유지되고 작업 컨텍스트에 mapreduce.input.fileinputformat.inputdir으로 저장된다는 것이 밝혀졌습니다. 그래서, 내 용액

Runner.java X이 입력 경로가 발견 될 수있는 첫 번째 정수

for(int i=X; i<ar.length; i++) { 
    FileInputFormat.addInputPath(job, new Path(ar[i])); 
} 

.

InputMapper.java

#Get the name of the input source in the current mapper 
Path filePath = ((FileSplit) context.getInputSplit()).getPath(); 
String filePathString = ((FileSplit) context.getInputSplit()).getPath().toString(); 
#Get the ordered list of all input sources 
String pathMappings = context.getConfiguration() 
    .get("mapreduce.input.fileinputformat.inputdir"); 

I는 입력 소스가 작업에 추가되는 순서를 알고, 나는 다음 숫자를 사용하여 사용자가 설정 한 구성 특성을 가지고 있고, 순서에 번호를 매핑 할 수 있습니다 여기서 입력 소스가 CLI의 작업에 추가되었습니다.

+0

또는 입력 소스의 맵핑을 러너 클래스의 작업 컨텍스트에 추가 한 다음 매퍼에서 액세스 할 수 있습니다. –

0

MultipleInputsPathFilter 통합을 제공하는지 확실하지 않습니다. 그러나 하나를 확장하고 일치하는 파일을 조건에 따라 다른 Mapper 유형으로 확장 할 수 있습니다. 이 목록에 매퍼를 처리

FileStatus[] csvfiles = fileSystem.listStatus(new Path("hive/path"), 
      new PathFilter() { 
       public boolean accept(Path path) { 
        return (path.getName().matches(".*csv$")); 
       } 
      }); 

지정 : 당신이 필요한 정규식을 제공해야 각 파일 유형에 대해

MultipleInputs.addInputPath(job, csvfiles[i].getPath(), 
           YourFormat.class, CsvMapper.class); 

. 당신이 잘하고 있기를 바랍니다.

+0

새로운 입력 소스에 대한 작업을 수정해야하며 mapper가 어떤 소스를 사용할 구성인지 식별 ​​할 수 없으므로 이것이 유효한 해결책이라고 생각하지 않습니다. 모든 입력은 동일한 매퍼 클래스에 의해 처리됩니다. 입력의 일부 메타 데이터 특성을 기반으로 각 입력에 사용할 구성을 알아야합니다. 제 질문에 대해 오해 한 것 같습니다. 제 질문이 명확하지 않은 경우 사과드립니다. –

+0

내가 오른쪽 질문에 대한 질문이있어,하지만 나는'MultipleInputs' 또는'Mapper'가 그런 API를 제공한다고 생각하지 않는다. 다르게 처리 할 때 2 개의 매퍼가 잘못 되었습니까? 맵을 넣을 일반적이고 복잡한 논리가있는 경우 추상 클래스를 만들고 확장하십시오. – blackSmith

+0

"논리"(열 매핑)는 최대 N 개의 다른 입력에 대해 입력 기준으로 구성 할 수 있어야하기 때문에. 새로운 입력이 추가 될 경우 재 컴파일이 허용되지 않습니다. –

관련 문제