분명히 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 방법을 사용해야 할 수도 있습니다.
답장을 보내 주셔서 감사합니다. 이것은 내가하고 있었던 일이며 더 나은 해결책이있을 것이라고 생각했으며, 이것이 바로 해결해야 할 일입니다. 답변 해 주셔서 감사합니다. – javanx
불행히도, 불행히도 금형을 벗어나는 순간에 일이 빨리 터지지 않을 수 있습니다. –
100GB 데이터 및 기타 계산 작업을 9 개의 데이터 노드와 216 개의 매퍼로 50 분 소요합니다. 성능이 좋지 않은 것으로 간주됩니까? – javanx