2010-06-25 3 views
5

나는 한 번에 하나씩 큰 파일을 조작해야하는 Hadoop 0.20에서 일하고있다. (파일 기반 데이터를 MapReduce에 더 적합한 더 깨끗한 라인 기반 형식으로 가져 오는 전처리 단계입니다.)제로 기어를 사용할 때 Hadoop에서 무작위로 정렬 된 매퍼 출력을 얻을 수 있습니까?

내가 가진 출력 파일의 수는 무제하지만 각지도의 출력은 다음과 같을 수 있습니다. 최대 하나의 출력 파일 및 각 출력 파일을 정렬해야합니다.

    numReducers = 0으로 실행하면 신속하게 실행되고 각 매퍼는 자체 출력 파일을 작성하지만 파일은 정렬되지 않습니다.
  • 하나의 감속기 (일반 Reducer.class)를 추가하면 하나의 파일에 불필요한 전역 정렬 단계가 추가되어 많은 시간이 소요됩니다 (맵 작업보다 훨씬 오래 걸립니다).
  • 여러 감속기를 추가하면 개별지도 작업의 결과가 함께 혼합되어지도의 출력이 여러 파일로 끝납니다.

Reducer를 사용하거나 느린 전역 병합을 건너 뛰는 다른 방법을 사용하지 않고도 각 작업의 출력에서 ​​맵측 정렬을 수행하도록 Hadoop을 설득 할 수있는 방법이 있습니까?

답변

2

전역 정렬을 수행하는 한 가지 방법은 사용자 정의 분할기를 사용하고 축소 기용 범위 파티셔닝을 수행하는 것입니다. 이것이 작동하려면 매퍼 출력 키의 범위를 알아야합니다. 키 범위를 n 버킷으로 나눌 수 있습니다. 여기서 n은 리듀서의 수입니다.키가 매핑되는 버킷에 따라 매퍼 출력이 특정 감속기로 라우팅됩니다.

각 감속기의 출력이 정렬됩니다. 모든 감속기 출력의 콜렉션은 범위 파티셔닝 때문에 전체적으로 정렬됩니다. 감속기 출력 파일을 파일 이름의 5 자리 숫자와 동일한 순서로 가져 오면됩니다.

주의해야 할 사항 중 하나는 키 배포의 비뚤어 짐 (skew)이므로 클러스터에서 일정하지 않은 감속기로드가 발생합니다. 이 문제는 배포 정보 즉 키의 막대 그래프가있는 경우 완화 할 수 있습니다. 그런 다음 버킷 길이를 같지 않게 만들고 각 버킷의 길이를 대략 같은 수의 키로 유지할 수 있습니다.

희망이 있습니다.

0

아래의 Ben의 의견을 참조하십시오. 작동하지 않습니다. 이 잘못된 대답을 남겨 두어 적어도 작동하지 않는 것이 무엇인지 알 수있게 할 것입니다.

나는 이것이 Combiner이 당신을 위해 무엇을 할 것이라고 생각합니다. 중간 출력의 지역 집계를 수행 에 JobConf.setCombinerClass (클래스)를 통해,

사용자가 선택적으로 결합기를 지정할 수 있습니다 : 나는 그들에게 자신을 사용한 적이 있지만, http://hadoop.apache.org/common/docs/r0.20.1/mapred_tutorial.html 상태 (섹션 페이로드/매퍼) 은 의 데이터 량을 매퍼에서 감속기로 전송하는 데 도움이됩니다.

본인은 신원 감속기를 결합기로 지정한 경우 각 매퍼의 출력을 정렬해야한다는 것을 알았습니다.

+0

"job.setCombinerClass (Reducer.class)"가 있습니다. 감속기가 0 일 때 적용되지 않는 것 같습니다. Mapper.java에서 :

작업이 0으로 감소하면 Mapper의 결과가 키 정렬없이 OutputFormat에 직접 기록됩니다.

그래서 나는 이것을 회피하거나 다른 방법으로 같은 효과를 얻을 수있는 방법이 있는지 묻고 싶습니다. –

+0

너무 나쁨. 그래서 맵퍼의'map' 콜백에서 아무 것도 출력 할 수 없지만 단순히 메모리에 수집 할 값을 숨기면됩니다. (너무 커지지 않도록 충분한 매퍼를 사용하십시오). 그런 다음'cleanup' 호출에서 값을 직접 정렬하고 출력하십시오. –

+0

예 - 매퍼마다 메모리가 문제가 될 수 있지만 직접 분류해야한다고 생각합니다. 입력 해 주셔서 감사합니다. –

2

Combiners는 데이터를 전체적으로 정렬하지 않으므로 기본적으로 감속기 데이터를 부분적으로 집계하는 캐시입니다.

일반적으로 각 매퍼의 출력을 개별적으로 정렬하지 않으려는 경우, 매퍼 파일 id를 출력의 일부로 추가하고 사용자 정의 파티션 함수를 사용하여 각 매퍼의 출력이 개별적으로 분할되지 않도록하십시오. 따라서 별도로 정렬되므로 모든 매퍼의 출력이 항상 하나의 파일에 포함됩니까? 또한 파일 ID별로 그룹화하여 각 입력 파일의 정렬 된 출력을 개별적으로 얻을 수 있습니다.

궁금한데 왜 매퍼 출력을 별개로 정렬하고 싶습니까?

또 다른 생각에 따르면, Hadoop은 출력을 분류하면 실제로 매퍼 사이드 정렬 ("셔플")을 수행 할 것이므로 많은 reducers를 사용하여 실행 한 경우 임시 파일을 삭제하지 않아도됩니다.

+0

속도면에서 많은 감속기를 사용하지만 출력을 무시하고 대신 임시 정렬 된 맵 파일을 유지하는 부분적 해결책 일 것 같습니다. mapper 출력 파일을 향후 작업에 대한 입력으로 사용하고 정렬 된 파일을보다 쉽게 ​​사용할 수있는 연대순 구조로 정렬되도록 유지하려고했습니다. 그러나 지금은 엄격하게 정렬되지 않은 경우 쿼리하기가 더 쉬운 다른 매퍼 출력 형식을 사용하는 경로를 따라 가고 있습니다. 어쨌든 MR에 더 적합하다고 느낍니다. 답변 해 주셔서 감사합니다. –

1

맵퍼가 소비하는 데이터가 현저하게 크지 않으면 데이터를 수집하지 않고 로컬 정렬 된 데이터 구조로 데이터를 추적 할 수 있습니다. 그런 다음 정리/완료 단계에서 정렬 된 데이터의 기록/수집을 수행 할 수 있습니다.