2015-01-30 3 views
2

Mapper가 하위 그룹에 속한 데이터를 내보내고 하위 그룹이 그룹에 속하는 경우가 있습니다.두 값으로 그룹화하는 감속기

하위 그룹의 모든 값을 더하고 각 그룹에 대해 그룹의 모든 하위 그룹 사이에 최소값을 찾아야합니다.

그래서, 난 내 출력 그래서 실질적으로 그룹에 필요

그룹 2에 대한

Group1, 1, (2+3+4) 
Group1, 2, (1+2) 
Group1, 3, (1+2+5) 

Group1 min = min((2+3+4),(1+2),(1+2+5)) 

동일해야이

Group 1 

group,subgroupId,value 
Group1,1,2 
Group1,1,3 
Group1,1,4 
Group1,2,1 
Group1,2,2 
Group1,3,1 
Group1,3,2 
Group1,3,5 

Group 2 

group,subgroupId,value 
Group2,4,2 
Group2,4,3 
Group2,4,4 
Group2,5,1 
Group2,5,2 
Group2,6,1 
Group2,6,2 

그리고처럼 보이는 매퍼의 출력이 두 번, GROUP에 의해 첫 번째 그룹 다음 SUBGROUPID에 의해 그 그룹의 내부.

그래서 I가 그룹에서 최소 합을 방출한다, 최소한의 합이 3이기 때문에, 소정 실시 예에서 제 감속기는 (2,3)를 방출해야하고 따라서 ID 2.

와 소자로부터 온다 그것은 두번 줄이는 reduce를 사용하여 가장 잘 풀릴 수있을 것 같습니다, 첫번째 reduce는 id에 의해 그룹화 된 원소를 얻었고 그것은 Group id에 의해 그룹화 된 두번째 Reducer로 전달 될 것입니다.

이것이 의미가 있으며 구현 방법은 무엇입니까? 나는 ChainedMapper와 ChainedReducer를 보았지만이 목적에 적합하지 않습니다.

감사

+0

맵퍼는 어떤 ID가 어떤 그룹에 속하는지 어떻게 알 수 있습니까? 원래 입력 샘플을 줄 수 있습니까? 또는 그룹이 중요하지 않으며 입력 분할을 식별하는 것뿐입니다 (그리고 두 개의 매퍼가 있습니다)? –

+0

그게 문제입니다, 각 레코드는 어떤 그룹에 속해 있습니다. 그래서 그룹에 관한 정보는 각 레코드에서 나옵니다. 그래서 저는 그룹별로 그룹화 한 다음 하위 그룹별로 그룹화해야합니다 (실제로는 동일한 키가있는 레코드가 포함되어 있음). 나는 내 질문을 편집 할 것이다. – Marko

답변

0

모든 데이터를 하나의 시스템의 메모리에 들어갈 수 있다면, 당신은 단순히 하나의 감속기 (job.setNumReducers(1);)와 두 개의 임시 변수를 사용하여 단일 작업에서 모두이 작업을 수행 할 수 있습니다. 출력은 감속기의 클린업 단계에서 방출됩니다. 새 하둡 API (즉, cleanup() 방법을 지원)를 사용하는 경우 여기에 대한 의사가있다 (아래에 요약)

int tempKey; 
int tempMin;  

setup() { 
    tempMin = Integer.MAX_VALUE; 
} 

reduce(key, values) { 
    int sum = 0; 
    while (values.hasNext()) { 
     sum += values.next(); 
    } 
    if (sum < tempMin) { 
     tempMin = sum; 
     tempKey = key; 
    } 
} 

cleanup() { //only in the new API 
    emit(tempKey, tempMin); 
} 
+0

답변 해 주셔서 감사합니다.하지만 그룹을 고려하지 않았습니다. 어쩌면 충분히 명확하게 문제를 표현하지 않았을 수도 있습니다. 그래서 각 키에 대해 최소 합계를 찾으려는 것이 아니라 모든 키에 대해 각 키에 대한 최소 합계를 GROUP에 넣으려고합니다. 따라서 나의 가치관은 열쇠뿐만 아니라 그룹에 의해 그리고 열쇠에 의해 분류 될 필요가 있습니다. 내 질문을 다시 생각해보십시오. 이 경우 어떻게 하시겠습니까? 또한 단일 컴퓨터에서 이와 같은 작업을 수행하는 것이 좋습니다. 나는 그것이 클러스터의 노드 들간의 통신없이 더 빠를 것이라고 믿는다. – Marko

0

당신의 접근 방식을, 내가 어떻게 할 것입니다.

작업 1

  1. 매퍼하십시오 subgroupid
  2. 결합기/감속기 (동일한 클래스)에 id을 대입 subgroupid의 최소 value을 찾아 낸다.

작업 2 :

  1. 매퍼하십시오 subgroupidgroupid을 지정합니다.
  2. Combiner/Reducer (동급) : groupid에 대해 최소 value을 찾습니다.

이 가장 다음과 같은 이유로이 작업에 구현됩니다

  • 는 맵퍼 및 감속기 상당히을 (당신이 주위의 모든 groupids 처음 찾는 것에 대해 걱정할 필요가 없습니다) 단순화합니다.매퍼에서 (groupid, subgroupid) 쌍을 찾는 것이 중요하지 않을 수 있습니다. 2 명의 매퍼를 쓰는 것은 사소한 일입니다.
  • 지도에 따른 단축 프로그래밍 지침 Tom White in Hadoop: The Definitive Guide (Chapter 6).
  • Oozie 워크 플로는 종속 작업을 쉽고 간단하게 수용 할 수 있습니다.
  • 중간 파일 제품 (key:subgroupid, value: min value for subgroupid)은 작아야 네트워크 리소스 사용이 제한됩니다.
+0

실제로 더 나은 방법은 groupid로 맵 결과를 분할하는 사용자 정의 분할자를 작성하는 것입니다. 나는 그것에 대해 생각하고 나중에 대답 할 것이다. –

+0

답변 해 주셔서 감사합니다.하지만이 과제가 의미하는 바가 확실하지 않습니다. 그룹 ID는 이미 할당되어 있으며 하위 그룹 ID는 실제로 레코드 키로 식별됩니다. 어쩌면 내가 충분히 노골적이지 않았을 것인가, 내 질문을 조금 편집했다. 우선, 당신이 제시 한 첫 번째 직업은 합계를 찾고, 두 번째는 min을 찾아야합니다. 문제는 두 번째 매퍼가 필요 없으며 합계를 계산하는 감속기의 결과 만 전달한다는 것입니다. 또한, 나는 Oozie가 내 문제에 대해 무게가 있다고 생각한다. 또한 중간 출력이 너무 작 으면 다른 작업으로 보내야하는지에 대한 질문이 있습니다. – Marko

+0

다른 한편, 파티셔를 사용하는 아이디어는 합리적인 것처럼 보입니다. 어쩌면 그 아이디어를 대답으로 게시하고 아이디어를 조금 설명 할 수 있습니까? – Marko

관련 문제