2011-02-10 1 views
2

내 매퍼가 다른 매퍼가 처리 할 새 키/값을 생성하는 경우가 있습니다. 이것을 할 수있는 좋은 방법이 있습니까? 이를 달성하기 위해 내 자신의 사용자 지정 입력 형식 (큐?)을 작성하는 방법에 대해 생각해 보았습니다. 어떤 아이디어? 감사!하둡 재귀 적 매핑

편집 : 그래서 완전히 재귀입니다

방법 1

 
Map Step 1 
(foo1, bar1) -> out1 
(foo2, bar2) -> out2 
(foo3, bar3) -> (fooA, barA), (fooB, barB) 
(foo4, bar4) -> (fooC, barC) 

Reduction Step 1: 
(out1) -> ok 
(out2) -> ok 
((fooA, barA), (fooB, barB)) -> create Map Step 2 
((fooC, barC)) -> also send this to Map Step 2 

Map Step 2: 
(fooA, barA) -> out3 
(fooB, barB) -> (fooD, barD) 
(fooC, barC) -> out4 

Reduction Step 2: 
(out3) -> ok 
((fooD, barD)) -> create Map Step 3 
(out4) -> ok 

Map Step 3: 
(fooD, barD) -> out5 

Reduction Step 3: 
(out5) -> ok 

-- no more map steps. finished -- 

을 명확히해야한다. 일부 키/값은 감소를 위해 출력을 내보내고, 일부는 매핑을 위해 새 키/값을 생성합니다. 주어진 실행에서 얼마나 많은지도 또는 축소 단계가 발생할 수 있는지 실제로 알지 못합니다.

이 방법은 그 자체가 입력 목록을 공급하는 매퍼를 얻을 것 2

 
Map Step 1 
(foo1, bar1) -> out1 
(foo2, bar2) -> out2 
(foo3, bar3) -> (fooA, barA), (fooB, barB) 
(foo4, bar4) -> (fooC, barC) 
(fooA, barA) -> out3 
(fooB, barB) -> (fooD, barD) 
(fooC, barC) -> out4 
(fooD, barD) -> out5 

Reduction Step 1: 
(out1) -> ok 
(out2) -> ok 
(out3) -> ok 
(out4) -> ok 
(out5) -> ok 

방법. 마지막으로 어떤 방법으로 구현하는 것이 더 쉬운 지 잘 모르겠습니다.

+0

다른 입력의 MR 프로세싱의 깊이가 다르다는 것을 알았습니까? 하나의 MR에 의한 처리 중 일부는 체인이 필요합니까? –

+0

네, 맞습니다. 좋은 비유는 재귀적인 디렉토리 목록 일 것입니다. 매퍼는 디렉토리를 가져 와서 파일을 방출합니다. 내가 다른 디렉토리를 쳤다면, 나는 그것을 매퍼로 다시 공급할 것이다. – eric

+0

잠깐, 나는 그것이 다른 방향이라고 생각한다. 필자는 파일을 가져 와서 내보내는 매퍼 (mapper)와 유사하다고 말할 것입니다. 파일 중 하나가 디렉토리 일 경우 디렉토리의 내용을 읽고 각 파일을 다시 매퍼에 공급합니다. – eric

답변

1

"방법 1"방법을 사용하면 Hadoop을 통해 전체 데이터 집합을 실행하고 Map을 통해 전체 "재귀 깊이"를 줄일 수 있습니다. 이것은 이것이 얼마나 깊은지를 반드시 확인해야하며 엄청난 성능 영향을 받게 될 것임을 의미합니다.

재귀 깊이가 제한적이라고 말할 수 있습니까?

그렇다면 필자는 확실히 "방법 2"로 가서 실제로 한 매퍼 호출 내에서 필요한 재귀를 수행하는 방식으로 매퍼를 작성합니다. 더 간단하고 많은 성능을 절약 할 수 있습니다.

+0

예 재귀 깊이가 제한적이라고 말할 수 있습니다. 나는 스스로 Method2 스타일에 더 기대고있다. 매퍼가 더 많은 매퍼 입력을 내야하는 경우, 이는 계산 상으로 비쌉니다. 나는 재귀 적으로 똑같은 매퍼 입력을 계속해서 먹으면 매우 좋은로드 밸런싱을 얻지 못할 것이라고 생각한다. 하지만 나는 100 % 간단하다는 것을 더 잘 알았습니다. – eric

+0

하둡에 대한 경험으로 말하자면, CPU 시간이 많이 걸린다고해서 실제로 많은 것을 말하고 있습니다.) 레코드의 읽기 및 쓰기가 가능합니다. "방법 1"은 3 가지 작업을 수행합니다. 모든 데이터를 읽고 다시 쓰는 단계가 필요합니다 (참고 : 최신 단계로 이동해야하는 레코드 만 "하드"로 제한). 실제로 테스트하지 않으면 "방법 2"는 "방법 1"의 3 배 이상 걸릴 것이고 구현하기가 더 어려울 것입니다. 단지 2ct입니다. –

1

oazie [그리드 워크 플로우 정의 언어]를 사용하여 두 개의 M/R 작업을 처음으로 매퍼 (mapper) 만 갖는 문자열로 묶습니다. http://yahoo.github.com/oozie

+0

아마 Amazon Elastic MapReduce를 사용하고 있다고 언급 했어야합니다. 그들은 아직 oozie를 지원하지 않습니다. (하지만 그것은 매우 흥미로운 프레임 워크처럼 보입니다. 나는 문서에서 재귀 적 동작을 얻을 수 있는지 충분히 알지 못했지만, 레이더에서. – eric

1

작업의 시작 부분에있는 Hadoop MR 프레임 워크는 맵 작업을 실행해야하는지 계획하고 있으며 새 맵 작업이 동적으로 표시 될 준비가되어 있지 않습니다.
두 가지 가능한 해결책을 제안합니다 : a)지도 단계에서 다른 쌍을 방출하는 경우 동일한 매퍼로 피드하십시오. 따라서 매퍼는 일반적인 인수를 취하고 처리 후에는 추가 쌍이 처리 할 내부 로컬 대기열을 조사합니다. 작은 쌍의 보조 쌍이 있고 데이터 지역성이 그다지 중요하지 않은 경우 유용합니다.
b) 실제로 디렉토리 또는 이와 유사한 것을 처리하는 경우 - 작업 패키지의 기본 구조를 반복 할 수 있으며 즉시 필요한 모든 분할을 빌드 할 수 있습니다.

+0

그래, 나는 항상 자신을 미워해야합니다. MR이 설계되지 않은 방식으로! 좋아, 그래서 이런 종류의 방법에 대해 생각해 봤어. 대부분의 경우 나는 아주 많은 쌍 (100 이하)을 방출해야한다고 생각한다. 어떤 경우에는 잘 방출해야하지만 그래서 수천 개의 쌍으로 나뉘어져 있습니다. 하둡이 내 쌍을 보내야 할 곳을 선택할 수있는 방법이 있다면, 나는 더 좋을 것입니다. – eric

+0

비용에 달려 있다고 생각합니다. 한 쌍당 처리 수 있습니다. 수천 쌍의 로컬 매퍼에 문제가되지 않을 수 있습니다. 내가 l의 영향을 측정하는 것이 좋습니다 ocal 매퍼 처리. –

+0

@DavidGruzman 어떻게 할 수 있습니까) 부분? -> '같은 매퍼에게 먹여라.' 그것은 훌륭한 생각 인 것 같습니다! –