2012-09-21 2 views
1

이 질문은 Map/Reduce 정렬에 관한 질문입니다. I는 XXID이 식별자 I가 모두 동일 XXID가 같은 환원제로 진행되도록 할 정렬하려는 두 가지 값을 1 또는 2MapReduce 세 개의 필드를 기준으로 정렬

를 가지고 모든 문자열 값을 수

XXID, Identifier, TimeStamp 

세 필드

을 iterable에서 1이있는 필드는 타임 스탬프가 증가하고 2는 다음 필드가있는 iterable에서 처음옵니다.

아무도 도와 줄 수 있습니까?

답변

3

분명히 mapreduce 프레임 워크에 위배됩니다.하지만 할 일은해야합니다!


우선 정렬은 키에서만 수행됩니다. 따라서 값이 임의의 순서로 있다고 가정해야합니다. 따라서 우리는 XX에있는 모든 XXID, 식별자 및 타임 스탬프를 함께 가져 오는 방법을 찾아야합니다. (아마도 NullWriteable을 값으로 사용할 수 있습니다)

세 항목을 키에 맞추려면 WriteableComparable을 구현하여 새 데이터 유형을 만들어야합니다. 이 새로운 클래스를 세 개의 값으로 묶고 JavanxTriple이라고 해보자.

MapReduce 종류의 JavanxTriple 항목을 사용자 정의하는 방법은 .compareTo 기능을 Comparable에서 변경하는 것입니다. XXID를 먼저 비교 한 다음 1 또는 2를 비교 한 다음 시간 소인을 비교하십시오.


다음으로 이러한 각각의 항목이 개별 키이므로 기본적으로 데이터가 다른 축소 자로 이동한다는 문제를 해결해야합니다. 기본적으로 원하는 데이터 스트림을 계산할 수는 없습니다. 이 문제를 해결하려면 사용자 정의 partitioner을 작성해야합니다. 분할자는 각 레코드가 감속 될 감속기를 알려줍니다. 이렇게하려면 .getPartition을 무시합니다. .getPartition을 계산할 때는 XXID를 사용하여이 숫자를 결정하십시오 (키의 식별자 및 타임 스탬프 부분 제외). 그런 식으로 같은 XXID를 가진 모든 아이템이 같은 감속기로 보내집니다.


마지막으로 감속기를 구현하는 방법이 일반적인 것이 아니라는 문제점이 있습니다. reduce는 키당 한 번만 호출되며 전달 된 Iterable에는 NullWriteable 만 있습니다.

이 문제를 해결하려면 Reducer 클래스의 일부 정적 변수를 사용하여 reduce 함수에서 수행중인 작업을 추적하십시오. XXID가 변경되면이를 감지해야 다음 분석을 전환 할 수 있습니다. 문제를 해결하고 완료하려면 setup and cleanup 방법을 사용해야 할 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 이것은 내가하고 있었던 일이며 더 나은 해결책이있을 것이라고 생각했으며, 이것이 바로 해결해야 할 일입니다. 답변 해 주셔서 감사합니다. – javanx

+0

불행히도, 불행히도 금형을 벗어나는 순간에 일이 빨리 터지지 않을 수 있습니다. –

+0

100GB 데이터 및 기타 계산 작업을 9 개의 데이터 노드와 216 개의 매퍼로 50 분 소요합니다. 성능이 좋지 않은 것으로 간주됩니까? – javanx

관련 문제