2016-06-30 1 views
0

동일한 경로로 두 번 addinputpath 함수를 입력하면 매번 동일한 파일의 두 매퍼를 생성 할 수 있지만 파일을 매번 약간 다르게 처리하고 싶습니다.다른 매개 변수로 두 번 파일 읽기

특히 Job 클래스 (configuration.set/get 사용)를 통과 한 여러 매개 변수를 사용하고 싶습니다. 파일이 다르면 컨텍스트/inputsplit 클래스를 사용하여 파일의 경로/이름을 얻습니다.하지만 이제는 그 파일을 구별 할 수 없습니다. 이견있는 사람?

각 매퍼는 다른 maptask이지만 maptasks와 관련된 정보를 사용할 수 있는지는 알 수 없습니다. 또한 프레임 워크가 maptask에 inputsplits와 일치하는 순서를 알지 못합니다. 유용 할 수 있습니다.

또는 I 파일 (다른 이름을 사용)을 복제 할 수 있지만 그게 내가 당신의 매퍼에이 논리를 넣어 당신을 추천 할 것입니다 자원

답변

0

필자는 inputsplit 및 inputformat 클래스 (편의상 fileinputformat 및 filesplit)를 덮어 써야했습니다.

분할을 읽는 시간을 구분하기 위해 filesplit에 추가 필드를 추가했습니다. 작동 중입니다

0

의 낭비 일 것이다. Hadoop이 동일한 파일을 두 번 스캔하고 처리하는 것보다 효율적입니다.

그래서 의사 코드가 그렇게 될 것이다 :

map(key, value, context) { 

    //do something with this key/value 
    ... 
    //emit output 1 
    context.write(...) 

    //do something else with this the same key/value 
    ... 
    //emit output 2 
    context.write(...) 
} 

당신이 당신의 출력 1과 2는 다른 감속기에 파견해야 할 경우, 당신은 그렇게 당신의 출력 키를 정교하게해야합니다.

+0

문제는/*이 키 값 * /으로 많은 일을하기 때문에 많은 비용이 들며 방출이 병행되어야합니다. 동일한 파일을 두 번 읽는 것을 구분할 수있는 다른 방법이 있습니까? – user3161227

+0

두 스레드에서 실행하고 둘 다 완료 될 때까지 기다리는 것이 어떻습니까? Hadoop은 어쨌든 동일한 노드에서 여러 매퍼를 실행할 수 있으므로 실제로 별 차이가 없습니다. – yurgis

+0

/*이 키 값 * /을 사용하여/* 작업을 수행하는 것이 값 비싸면 최상의 병렬 처리를 위해 더 많은 매퍼를 실행하십시오. 여기에서도 한 매퍼가 출력 1을 쓰는 동안 다른 한 매퍼는 출력 2를 쓰는 것일 수 있습니다. 위의 접근 방식은 입출력이 두 번 수행되는 것을 피하기 때문에 성능이 뛰어납니다. 둘째, 2 개의 파일을 구별하고 동일한 MR 작업에서 다른 매개 변수를 가져올 수 없습니다. –

관련 문제